Leetcode题库 — 整数反转(python)

本文探讨了在32位有符号整数环境下,如何有效反转整数的每一位数字,并提出了两种解决方案,一种是通过字符串转换和切片,另一种是对10取余并构建字符串,同时考虑了负数和溢出的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目来源
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231 − 1](231=2147483648)。请根据这个假设,如果反转后整数溢出那么就返回 0。

示例

输入: 123 # 正数反转
输出: 321

输入: -123 # 负数反转
输出: -321

输入: 120 # 数字反转后为021,整数结果为21
输出: 21

输入: 8098109383 # 反转后为3839018908,结果溢出
输出: 0

解法一

解题思路:关于整数反转问题主要涉及三个问题,

  1. 负数只反转数字部分,不带负号;
  2. 若给定的整数最末几位全为0,反转后则忽略不存在,例如:1200 —> 21;
  3. 反转后的整数是否溢出。

整数反转先将整数转化为字符串,再通过字符串切片逆序输出,得到反转后的字符串,最后将字符串转化为整数返回。(此种方法无需考虑问题2)
代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        y = str(x)      # 将整数转化为字符串

        """反转字符串"""
        if x >= 0:
            z = y[::-1]     # x为非负数则直接切片反转
            res = int(z)    # 字符串转整数
        elif x < 0:
            L = -len(y)
            z = y[-1:L:-1]      # x为负数则只反转索引0位置后的字符
            res = -int(z)       # 字符串转整数

        """判断反转后的整数是否溢出"""
        if res < -2**31 or res > 2**31 - 1:
            return 0        # 如果反转后的结果溢出,则返回0
        else:
            return res      # 否则返回结果

在这里插入图片描述

解法二

解题思路:整数对10循环取余,将余数依次存成字符串,最后将字符串转化为整数。
代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        """当整数为0时,直接返回x"""
        if x == 0:
            return 0
            
        """整数对10取余"""
        X = abs(x)
        res = ''
        while X != 0:
            rem = X % 10    # 整数对10取余
            res += str(rem)     # 将余数存为字符串
            X //=10     # 整数对10取整

        """字符串转数字"""
        if x < 0:
            res = -int(res)
        else:
            res = int(res)

        """判断是否溢出"""
        if res < -2**31 or res > 2**31-1:
            return 0
        return res

在这里插入图片描述
下面为思路类似,但更简短的代码:
代码来源

class Solution:
    def reverse(self, x: int) -> int:
        y, res = abs(x), 0
        of = (1 << 31) - 1 if x > 0 else 1 << 31 	# 整数范围[−2^31^, 2^31^ − 1]
        while y != 0:
            res = res * 10 + y % 10		# 整数反转的关键语句
            if res > of: return 0
            y //= 10
        return res if x > 0 else -res

关于”1<<31“

另外

上述解法虽执行时间较短,但消耗的内存较大。代码在内存消耗方面尚有大的改进空间。

若有不足或更好解法,后续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值