Leetcode 371.两整数之和 By Python

时间:2023-03-09 23:45:00
Leetcode 371.两整数之和 By Python

不使用运算符 +- ,计算两整数 ab 之和。

示例 1:

输入: a = 1, b = 2
输出: 3

示例 2:

输入: a = -2, b = 3
输出: 1

思路

比如\(5+6=11\)

我们可以按照如下步骤:

  • 先不考虑进位为1
  • 考虑进位之后\(10+1=11\)
  • 直到没有进位的情况出现才结束

二进制也是类似处理:

  • 先“按位加”,也就是异或,在python中为^
  • 处理进位,进位就是和,在python中为&,还要左移<<1位
  • 循环上述步骤就好了

要特别注意的是:

python中一直左移是不会溢出的,所以要手动模拟32位int型

代码

class Solution(object):
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
MAX_INT = 0x7FFFFFFF #int类型最大的值
MIN_INT = MAX_INT + 1
MASK = 0x100000000 #等于2^32,1-32位上都是1
while b != 0:
carry = (a & b) << 1 #表示进位
a = (a ^ b) % MASK #对其取余则将范围限制在[0,2^32-1]内,也就是int的范围
b = carry % MASK #同理
return a if a <= MAX_INT else ~((a % MIN_INT) ^ MAX_INT) #如果小于MAX_INT就不用处理了,如果溢出就要:
#以4位bit为例,从0000-1111,可以表示的范围为[0,15],如果计算出16那就是溢出了,16是10000,此时的MIN_4BIT为16,取余为0,0000异或1111为1111再取反就是0了,将范围限制在了4位bit的范围内

当然你也可以这么偷懒哈哈哈哈哈哈哈

class Solution(object):
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
return sum([a,b])