LeetCode第七题:翻转整数 【7/1000 python】

发布于:2024-04-06 ⋅ 阅读:(102) ⋅ 点赞:(0)

👤作者介绍: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。

 示例:

解题思路

  1. 处理符号:首先,我们需要处理整数的符号。如果是负数,我们可以先转化为正数处理,最后再加上符号。
  2. 翻转数字:将整数转换为字符串后翻转,或者通过数学方法一位位取出数字,然后重新组合。
  3. 溢出处理:翻转后的整数可能会超过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_MININT_MAX 用于表示32位有符号整数的范围。
  • 通过 negative 变量来记录原始整数的符号。
  • while 循环中,我们不断地取出 x 的最后一位数字,并检查翻转后的结果是否会溢出。
  • 如果不会溢出,则更新 res
  • 最后根据原始整数的符号返回最终结果。

总结

不断迭代和思考来提升代码的效率和鲁棒性。从最初的字符串翻转到考虑溢出,再到最终的数学方法,这个过程还是很有趣的

如果本文对你有帮助,点个赞是对作者最大的鼓励!

 


网站公告

今日签到

点亮在社区的每一天
去签到