👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅LeetCode解锁1000题: 打怪升级之旅
https://blog.csdn.net/cciehl/category_12625714.html
python数据分析可视化:企业实战案例https://blog.csdn.net/cciehl/category_12615648.html
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级
“翻转整数”要求我们给出一个32位的有符号整数,然后将这个整数中的数字进行翻转,最后返回翻转后的整数。这个问题看起来简单,但实际上涉及到了一些边界条件和整数溢出的处理,是一个非常好的编程练习。
问题描述
给你一个32位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过32位的有符号整数的范围 [−2^31, 2^31 − 1]
,就返回 0。
示例:
解题思路
- 处理符号:首先,我们需要处理整数的符号。如果是负数,我们可以先转化为正数处理,最后再加上符号。
- 翻转数字:将整数转换为字符串后翻转,或者通过数学方法一位位取出数字,然后重新组合。
- 溢出处理:翻转后的整数可能会超过32位有符号整数的表示范围,需要进行检查并在必要时返回0。
代码示例
以下是使用数学方法解决这个问题的 Python 代码示例:
初级错误:直接翻转
一个直观的错误方法是直接翻转整数,忽略了溢出的问题。
def reverse_v1(x: int) -> int:
str_x = str(x)
if x < 0:
return int('-' + str_x[:0:-1])
else:
return int(str_x[::-1])
问题:这段代码没有考虑到翻转后整数可能超出32位有符号整数的范围。
改进:添加溢出检查
在意识到翻转后可能会溢出后,我们尝试在转换为整数之前检查溢出。
def reverse_v2(x: int) -> int:
str_x = str(x)
if x < 0:
result = int('-' + str_x[:0:-1])
else:
result = int(str_x[::-1])
# 溢出检查
if result > 2**31-1 or result < -2**31:
return 0
else:
return result
问题:虽然这段代码处理了溢出的问题,但它仍然依赖于字符串操作,并没有充分利用数学方法的潜力。
最终版本:数学方法和溢出处理
最终的版本采用数学方法来逐位翻转整数,并在过程中检查溢出。
def reverse(x: int) -> int:
INT_MIN, INT_MAX = -2**31, 2**31 - 1
res = 0
negative = x < 0
x = abs(x)
while x != 0:
digit = x % 10
x //= 10
# 检查溢出
if (res > INT_MAX // 10) or (res == INT_MAX // 10 and digit > INT_MAX % 10):
return 0
res = res * 10 + digit
return -res if negative else res
代码解释
INT_MIN
和INT_MAX
用于表示32位有符号整数的范围。- 通过
negative
变量来记录原始整数的符号。 - 在
while
循环中,我们不断地取出x
的最后一位数字,并检查翻转后的结果是否会溢出。 - 如果不会溢出,则更新
res
。 - 最后根据原始整数的符号返回最终结果。
总结
不断迭代和思考来提升代码的效率和鲁棒性。从最初的字符串翻转到考虑溢出,再到最终的数学方法,这个过程还是很有趣的
如果本文对你有帮助,点个赞是对作者最大的鼓励!