Sum of Two Integers,LeetCode,371

LeetCode 371题是“两整数之和”(Sum of Two Integers),这道题要求在不使用加号(+)和减号(-)的情况下,计算两个整数的和。

题目描述

给定两个整数 ab,求它们的和。

注意

  • 你不能使用加号(+)和减号(-)。
  • 你可以使用位运算。

解题思路

这道题可以通过位运算来解决。位运算主要包括以下几种:

  • 与运算(&):用于找出两个数的二进制表示中同时为1的位。
  • 异或运算(^):用于找出两个数的二进制表示中不同时为1的位。
  • 左移运算(<<):用于将数的二进制表示向左移动指定的位数。

具体步骤如下:

  1. 异或运算a ^ b 可以得到两个数相加但不考虑进位的结果。
  2. 与运算和左移(a & b) << 1 可以得到两个数相加时的进位结果。
  3. 重复上述两个步骤,直到进位结果为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)

代码解释

  1. 掩码(mask):用于确保计算结果始终在32位整数的范围内。
  2. 循环:当 b 不为0时,继续计算不进位的和和进位。
  3. 返回结果:如果 a 是负数,需要将其转换成补码形式。

示例

假设 a = 1b = 2

  1. 第一次循环:
    • a = 1 ^ 2 = 3
    • b = (1 & 2) << 1 = 0
  2. 由于 b 为0,循环结束,返回 a = 3

复杂度分析

  • 时间复杂度:O(1),因为每次循环都会减少进位的位数,最坏情况下循环的次数是32(整数的位数)。
  • 空间复杂度:O(1),只使用了常数空间。

通过这种方法,我们可以在不使用加号和减号的情况下,计算出两个整数的和。希望这个解释对你有帮助!如果有更多问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注