思路一:自增自减运算【本质上这应该也是+ -法 num++ 等于 num=num+1;】
public class Solution {
public int Add(int num1,int num2) {
while(num2!=0)
{
num1++;
num2--;
}
return num1;
}
}
时间O(N) 空间O(1)
思路二:位运算【& | ^】
- 无进位的情况,两数异或运算即为和
- ①有进位的情况,两数相与再左移一位即为进位x
- ②两数异或即为不带进位和y,x+y即为两数之和,但是不允许使用加法,所以重复步骤①,直至进位和为0
非递归:
public class Solution {
public int Add(int num1,int num2) {
while(num2!=0)
{
int temp=num1^num2;
num2=(num1&num2)<<1;
num1=temp;
}
return num1;
}
}
递归:
public class Solution {
public int Add(int num1,int num2) {
if(num1==0||num2==0)
return num1^num2;
return Add((num1&num2)<<1,num1^num2);
}
}
时间O(1) 空间O(1)