返回
反转乾坤:LeetCode [7] 整数反转的妙趣横生之旅
闲谈
2023-10-09 21:19:15
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