[LC优选算法#12] 位运算 | 两整数之和 | 只出现一次的数字 II | 消失的两个数字

📅 2026/6/30 14:35:43
[LC优选算法#12] 位运算 | 两整数之和 | 只出现一次的数字 II | 消失的两个数字
1. 两整数之和两整数之和解题思路不能使用和-是一大痛点但是如果真的没思路笔试时直接使用也是可以对bushi普通的整数运算符这条路是行不通了但是有没有其他的运算符可以使用呢有的有的。我们可以把加数转化为二进制使用位运算解决。位运算O(1)我们可以使用异或^和与运算达到加法运算符的效果。根据这两个运算符的规则我们可以把异或看作无进位相加与看作进位不相加这样我们就有基本思路了一直循环无进位加法和进位直至没有进位为止。classSolution{public:intgetSum(inta,intb){while(b!0){unsignedintsuma^b;unsignedintcarryab;//转为无符号防止int左移时最高位符号处理时发生未定义情况asum;b(carry1);}returna;//自动强转}};2. 只出现一次的数字 II只出现一次的数字 II这道题中需要找到只出现一次的数字数组中的其他数字都出现了三次。解题思路可以使用哈希表解决但空间复杂度不是最优的。那有没有不需要开空间的解法呢有的有的我们可以通过位运算解决此类问题。位运算O(N)设要找的数为ret我们将数组中所有数的每个比特位相加然后**%3**这样就可以快速定位到ret的每个比特位是0还是1了组合每一个比特位即可得到ret。这种方法可以处理数组中某个数出现一次其余数出现n次的类似题。classSolution{public:intsingleNumber(vectorintnums){intret0;for(inti0;i32;i){intsum0;for(autox:nums){sum((xi)1);}sum%3;if(sum1){ret|(1i);//将某个二进制位设置为1}}returnret;}};3. 消失的两个数字消失的两个数字在上一篇文章中我们了解了如何在0-n中寻找缺失的某个数字方法是把数组中的数和0-n全部异或在一起[LC优选算法#11] 位运算 | 判断字符是否唯一 | 丢失的数字略微不同的是本题是268. 丢失的数字 260. 只出现⼀次的数字 III组合起来的题。丢失的数字只出现⼀次的数字 III在本题我们需要找出数组中缺失的两个数字如果使用位运算的方法仅仅全部异或的方法是不奏效的。怎么办呢解题思路位运算O(N)我们可以先将数组中的数和1~n区间内的所有数异或在⼀起问题就变成了有两个数出现了⼀次其余所有的数出现了两次。进⽽变成了260这道题。现在的关键就在于如何将这两个数分在不同组我们可以根据全部异或的结果找到比特位为1的位置相异为1说明缺失的两个数在这一个比特位上一定不同根据这个位置的不同将数组划分为此位为1和此位为0的两类分别进行异或这样得出的结果就是缺失的数了。classSolution{public:vectorintmissingTwo(vectorintnums){//异或nums和1~N的数intnnums.size();intval0;for(autox:nums){val^x;}for(inti1;in2;i){val^i;}//找不同位intposval(-val);inta0;for(autox:nums){if((xpos)!0){a^x;}}for(inti1;in2;i){if((ipos)!0){a^i;}}val^a;return{val,a};}};// 本期内容就到这里啦如果对你有帮助请三连支持我是青云我们下期见^_~