写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
方法一:
利用位运算,模拟加法。
- 首先让两个数字按位异或,计算出基本的值。不同为1,相同为0.
- 计算需要进位的数字,让两个数字按位与后,向左移动一位即可。
- 让第一步计算出的值 + 第二部计算出的进位数,就是答案。
可以看下推导过程:leetcode题解 - 但是由于不能使用加法,那么就只能让第三步中的+操作,使用第一步和第二步来进行相加运算。什么时候结束呢?根据题意,结果不会溢出32位,那么让它循环计算32次,就算每一次+操作都有进位,在运算了32次后,也就是第32次是进行一个相加的运算,第32次的进位为0。不可能再进位了,因为再进位就溢出了。
- 也可以通过判断进位为0来结束循环。
代码:
class Solution {
public int add(int a, int b) {
while(b != 0) {
int tem = a ^ b;
int carry = (a & b) << 1;
a = tem;
b = carry;
}
return a;
}
}
时间复杂度:O(1)最坏要循环32次。
空间复杂度:O(1)