LeetCode 371题是“两整数之和”(Sum of Two Integers),这道题要求在不使用加号(+)和减号(-)的情况下,计算两个整数的和。
题目描述
给定两个整数 a
和 b
,求它们的和。
注意:
- 你不能使用加号(+)和减号(-)。
- 你可以使用位运算。
解题思路
这道题可以通过位运算来解决。位运算主要包括以下几种:
- 与运算(&):用于找出两个数的二进制表示中同时为1的位。
- 异或运算(^):用于找出两个数的二进制表示中不同时为1的位。
- 左移运算(<<):用于将数的二进制表示向左移动指定的位数。
具体步骤如下:
- 异或运算:
a ^ b
可以得到两个数相加但不考虑进位的结果。 - 与运算和左移:
(a & b) << 1
可以得到两个数相加时的进位结果。 - 重复上述两个步骤,直到进位结果为0。
代码实现
以下是使用Python实现的代码:
class Solution:
def getSum(self, a: int, b: int) -> int:
32位整数的最大值和最小值
MAX = 0x7FFFFFFF
MIN = 0x80000000
# 掩码,用于获取32位整数
mask = 0xFFFFFFFF
while b != 0:
# 计算不进位的和
a, b = (a ^ b) & mask, ((a & b) << 1) & mask
# 如果a是负数,将其转换成补码形式
return a if a <= MAX else ~(a ^ mask)
代码解释
- 掩码(mask):用于确保计算结果始终在32位整数的范围内。
- 循环:当
b
不为0时,继续计算不进位的和和进位。 - 返回结果:如果
a
是负数,需要将其转换成补码形式。
示例
假设 a = 1
和 b = 2
:
- 第一次循环:
a = 1 ^ 2 = 3
b = (1 & 2) << 1 = 0
- 由于
b
为0,循环结束,返回a = 3
。
复杂度分析
- 时间复杂度:O(1),因为每次循环都会减少进位的位数,最坏情况下循环的次数是32(整数的位数)。
- 空间复杂度:O(1),只使用了常数空间。
通过这种方法,我们可以在不使用加号和减号的情况下,计算出两个整数的和。希望这个解释对你有帮助!如果有更多问题,欢迎继续提问。
发表回复