题目
算法思路
不用加减乘除的加法运算 = 不进位加法 + 进位 = 异或运算 + 与运算后左移一位,即,和 s = 无进位和 n + 进位 c
例如,a = 12, b = 10 时:
a(i) | b(i) | 无进位和 n(i) | 进位 c(i+1) |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
最终结果为 22, 即 10110
循环求无进位和 n 和进位 c,直到进位 c = 0,此时的和 s = n,返回 n
由于计算机系统中数值均用补码表示和存储,所以a、b是负数时该方法也是适用的。
具体代码
class Solution {
public int add(int a, int b) {
while(b != 0){//进位为0时跳出循环
int c = (a & b) << 1;//计算进位c
a ^= b;//计算无进位和n,赋给a
b = c;//将进位c赋给b
}
return a;
}
}
复杂度分析
- 时间复杂度: O ( 1 ) O(1) O(1),因为a、b不会溢出int32,所以最多循环32次,每轮循环内操作的时间开销为 O ( 1 ) O(1) O(1)
- 空间复杂度: O ( 1 ) O(1) O(1)