思路:
不能用普通的加减法,就用位运算,也就是二进制的加减法
代码:
class Solution {
public int add(int a, int b) {
while(b!=0){
int c=(a&b)<<1;//c=进位
a=a^b;//a=非进位和
b=c;//将进位数赋给b=进位
}
return a;
}
}
分解:
1)^是异或运算,与无进位和规律相同
&是与运算,与进位规律相同
例如:
9+1=10,如果是用&的思路来处理,则9+1得到的进位数为1,而不是10,所以要用<<1向左再移动一位,这样就变为10了
公式:
每次无进位求 + 每次得到的进位数,直到进位数为0为止
(a^b) ^ ((a&b)<<1)
复杂度分析:
时间复杂度:O(1)最差情况下a =a= 0x7fffffff , b = 1b=1,需要循环32次,常量级的复杂度
空间复杂度:O(1)