371. 两整数之和
371. 两整数之和
题目
Given two integers a and b, return the sum of the two integers without using the operators + and -.
Example 1:
Input: a = 1, b = 2
Output: 3
Example 2:
Input: a = 2, b = 3
Output: 5
Constraints:
-1000 <= a, b <= 1000
题目大意
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = 2, b = 3
输出: 5
提示:
-1000 <= a, b <= 1000
解题思路
可以利用二进制的性质:
- 异或运算
a ^ b:相当于不考虑进位的二进制加法。- 例如:
5 ^ 3 = 6,对应二进制0101 ^ 0011 = 0110。
- 例如:
- 与运算
a & b:用于计算进位,只有两位都为1时产生进位。- 例如:
5 & 3 = 1,对应二进制0101 & 0011 = 0001。
- 例如:
- 进位的左移
c << 1:将进位信息左移一位,模拟加法中的进位。
- 初始时
a和b为两个加数。 - 当
b == 0时,说明不再有进位产生,此时a即为结果。 - 否则,将
c = a & b计算出进位,将a = a ^ b更新为未进位加法的结果。 - 将
b = c << 1更新为进位信息,继续迭代直至b == 0。
复杂度分析
- 时间复杂度:
O(1),最多进行 32 次位操作。 - 空间复杂度:
O(1),不使用额外的空间。
代码
/**
* @param {number} a
* @param {number} b
* @return {number}
*/
var getSum = function (a, b) {
let c;
while (b !== 0) {
c = a & b;
a = a ^ b;
b = c << 1;
}
return a;
};
相关题目
| 题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
|---|---|---|---|---|---|
| 2 | 两数相加 | [✓] | 递归 链表 数学 | 🟠 | 🀄️ 🔗 |
