35. 两个整数之和
题目描述
不使用运算符 + 和 -,计算两整数 a、b 之和。
解题思路
核心在于利用位运算模拟加法过程。异或 ^ 运算本质是无进位加法,而按位与 & 配合左移 << 1 能得到进位位置。只要进位不为零,就需要将无进位结果与新的进位继续相加,直到进位消失。
C++ 代码
class Solution {
public:
int getSum(int a, int b) {
while (b) {
int sum = a ^ b; // 无进位和
int carry = (a & b) << 1; // 进位
a = sum;
b = carry;
}
return a;
}
};
核心流程解析
循环中不断迭代,a 存储当前无进位和,b 存储进位值。当 b 变为 0 时,说明没有更高位的进位需要处理,此时 a 即为最终结果。
36. 只出现一次的数字 II
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
解题思路
既然其他数字都出现三次,那么对于任意一个比特位,所有数字在该位上的 1 的总数必然是 3 的倍数加上目标数字该位的值(0 或 1)。因此,统计每一位上 1 出现的总次数并对 3 取模,即可还原出目标数字的二进制表示。
C++ 代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for (int i = 0; i < 32; i++) {
sum = ;
( x : nums) {
sum += ((x >> i) & );
}
ret |= ((sum % ) << i);
}
ret;
}
};


