- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode-371-两整数之和
[博客链接]
[题目链接]
[github地址]
[题目描述]
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2 输出:3 示例 2:
输入:a = 2, b = 3 输出:5
思路一:位运算
- 普通进位需要统计每一位的运算结果
- 记录之前的进位情况
- 第一种情况:两个当前位均为1,计算后结果位为前一位进位,同时进位变为1
- 第二种情况:两个当前位只有一个为1,计算结果后根据进位判断是否进位:
- 如果进位为1,则进位不变还是1,当前位为0
- 如果进位为0,则进位不变还是0,当前位为1
- 第三种情况:两个当前位都是0,根据进位判断,进位变为0
int res = 0;
for (int i = 0, t = 0; i < 32; i++) {
int num1 = (a >> i) & 1, num2 = (b >> i) & 1;
if (num1 == 1 && num2 == 1) {
res |= (t << i);
t = 1;
} else if (num1 == 1 || num2 == 1) {
res |= ((1 ^ t) << i);
}else{
res |= (t << i);
t = 0;
}
}
return res;
- 时间复杂度O(lgn)最多为32
- 空间复杂度O(1)
思路二:递归解决
- 其实这种非加减法运算符计算很容易想到异或运算
- 异或就是无进位加法运算
- 进位可以用(a&b)>>i
- 递归运算即可
public int getSum(int a, int b) {
return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
}
- 时间复杂度O(lgn)最多为32
- 空间复杂度O(1)