返回

反转乾坤:LeetCode [7] 整数反转的妙趣横生之旅

闲谈

LeetCode - [7] 整数反转:刷题打卡与别出心裁的逆向思维

在计算机科学的浩瀚世界中,整数反转是一个经典的算法难题,考验着我们的逻辑思维和编码能力。在 LeetCode 上,编号为 [7] 的这道题正是以此为舞台,让我们踏上一次反转乾坤的奇妙旅程。

正向审视:传统的反转算法

解决整数反转问题的传统思路,是将原整数逐位拆分,然后重新组装成一个反转后的整数。例如,对于整数 123,我们可以先将它拆分为个位数 3、十位数 2 和百位数 1,再按顺序重新组合成 321。

这种算法简单易懂,但缺点也很明显:对于长度较大的整数,逐位拆分和重新组装的过程会变得十分繁琐。因此,在实际应用中,我们往往需要寻找更巧妙的解决方案。

逆向思考:取余求商的妙用

别出心裁的思维往往能带来意想不到的突破。针对整数反转问题,我们可以尝试从一个截然不同的角度切入——利用取余和求商运算的特性。

首先,我们创建一个新的变量 reversed_num 来存储反转后的整数。然后,不断地对原整数 x 进行取余运算,将取余结果添加到 reversed_num 的末尾。与此同时,对 x 进行求商运算,去除末尾的数字。

例如,对于整数 123,我们可以这样进行反转:

reversed_num = 0
while x != 0:
    digit = x % 10  # 取余得到末尾数字
    reversed_num = reversed_num * 10 + digit  # 将末尾数字添加到反转后整数
    x //= 10  # 求商去除末尾数字

这种方法巧妙地利用了取余和求商运算,将繁琐的拆分和重组过程简化成了几个简洁的步骤。

边界处理:溢出和负数的考量

在实现整数反转算法时,我们需要特别注意两个边界情况:溢出和负数。

如果反转后的整数超过了 32 位有符号整数的范围,我们应该返回 0。可以使用以下条件判断是否存在溢出:

reversed_num > 2**31 - 1 or reversed_num < -2** 31

对于负数,我们只需要在反转之前对绝对值进行操作,然后在反转之后加上负号即可。

代码实现:Python 版

def reverse_integer(x):
    """
    反转一个 32 位有符号整数。

    Args:
        x (int): 原整数

    Returns:
        int: 反转后的整数
    """
    reversed_num = 0
    abs_x = abs(x)
    while abs_x != 0:
        digit = abs_x % 10
        reversed_num = reversed_num * 10 + digit
        abs_x //= 10

    if x < 0:
        reversed_num = -reversed_num

    if reversed_num > 2**31 - 1 or reversed_num < -2** 31:
        return 0

    return reversed_num