1、反转一个3位整数

这篇博客探讨了如何使用Python反转一个整数。首先,展示了书上版本的代码,该版本仅适用于三位数的反转。然后,提出了一个改进版本,通过将整数转换为字符串,再进行反转,实现了任意位数的整数反转。代码思路包括将数字转为字符串,存储到列表,反转列表,最后重新组合成整数。文章强调了Python内置方法`reverse()`和`.join()`在处理这个问题中的作用。

1、问题描述

输入number=123,输出321;输入900,输出9。

2、代码实现

书上版本:

class Solution():
    # 参数是整数number,返回值是一个反转后的数字
    def reverseInteger(self, number):
        h = int(number/100)
        t = int(number % 100/10)
        z = int(number % 10)
        return (100*z + 10*t + h)

if __name__ == '__main__':
    solution = Solution()
    num = 123
    ans = solution.reverseInteger(num)
    print('输入:', num)
    print('输出:', ans)

局限性:完成了目标,是反转了一个三位数,但是大于三位就不行了。

改进版本:
优点:不管多少位,都能进行反转。

class Solution():
    # 参数是整数number,返回值是一个反转后的数字
    def reverseInteger(self, number):
        a = []
        for i in str(number):
            a.append(i)
        a.reverse()
        return a

if __name__ == '__main__':
    solution = Solution()
    num = input('输入:')
    ans = solution.reverseInteger(num)
    ans1 = [str(i) for i in ans]
    output = int(''.join(ans1))
    # print('输入:', num)
    print('输出:', output)

3、代码思路

1、将整数转换成str;
2、将str放到一个列表里面;
3、利用.reverse()对列表进行反转;
4、利用.join()将列表转换成数字。

4、知识点

关键函数:

a.reverse()

解读:reverse()是python列表中的一个内置方法,用于反向列表中元素;语法:“list.reverse()”。reverse()方法没有返回值,但是会对列表的元素进行反向排序。

.join()

这个函数展开来写应该是str.join(item),join函数是一个字符串操作函数;join里放列表、元组、字典也是可以的。举个例子:

','.join('abc')
# 返回:'a,b,c'
';'.join([a,b,c])
>>  'a;b;c'
<think>嗯,用户想学习如何用Python实现整数反转。我需要先回顾一下整数反转的常见方法。通常,可以通过数学运算或字符串转换来实现。对于数学方法,可以通过循环取模和整除来逐步构建反转后的数字。而字符串方法则是将整数转换为字符串,反转后再转换回整数。但要注意处理负数和前导零的情况,以及溢出问题,特别是当反转后的数字超过32整数范围时,可能需要返回0。 首先,用户可能对这两种方法都感兴趣,但根据示例中的LeetCode引用,可能更关注数学方法,因为字符串方法虽然简单,但在某些情况下可能不符合题目要求。例如,LeetCode的整数反转问题通常要求不使用字符串操作,而是通过数学运算来实现。 接下来,我需要确保代码正确处理负数。比如,-123反转后应该是-321。此外,当反转后的数字超过32有符号整数的范围(即−2&sup3;&sup1;到2&sup3;&sup1;−1)时,应返回0。Python整数没有固定数,但题目通常会有这样的限制,所以代码需要模拟这一点。 数学方法的步骤大致是:循环取出原数字的最后一,然后将其添加到反转后的数字中,每次添加前检查是否溢出。例如,对于x=123,依次取出3、2、1,每次将反转后的数字乘以10再加上当前。同时,原数字不断除以10直到变为0。 然后,用户可能需要示例代码。根据引用中的LeetCode链接,可能参考该题的解法和代码结构。例如,处理负数时可以先取绝对值,反转后再恢复符号。溢出检查则需要在每一步乘以10之前判断是否会超过最大值除以10,或者在Python中可以直接比较结果是否超出范围。 另外,用户提供的引用中有关于二进制和十六进制的转换方法,但整数反转可能不涉及这些,不过需要注意不同进制的情况是否会影响反转逻辑。但根据问题描述,用户主要关注十进制整数反转,所以可以暂时忽略其他进制。 现在,需要编写一个函数,比如reverse_integer,接受一个整数x作为输入,返回反转后的结果,并在溢出时返回0。代码需要处理正负数,以及反转后的前导零(例如,100反转后是1,而不是001)。在Python中,负数取模的行为可能需要注意,例如-123 % 10在Python中会得到7,所以可能需要用绝对值来处理。 测试用例也很重要,例如输入123得到321,输入-123得到-321,输入120得到21,输入0得到0,以及输入1534236469(超过32整数范围的反转结果应为0)。 最后,用户可能还需要知道时间复杂度和空间复杂度,这里数学方法是O(log(x)),因为循环次数与x的数相关,而空间复杂度是O(1)。 总结步骤:处理符号→循环取模和整除→构建反转数→溢出检查→返回结果。</think>### Python实现整数反转的方法 #### 数学运算法 通过取模和整除操作逐步构建反转后的数字: $$ reversed = reversed \times 10 + x \% 10 $$ $$ x = x // 10 $$ 处理步骤: 1. 记录原始符号并转为正数处理 2. 循环取最后一构建新数字 3. 添加符号并检查溢出范围 4. 返回结果或0(溢出时) ```python def reverse_integer(x): INT_MAX = 2**31 - 1 INT_MIN = -2**31 sign = -1 if x < 0 else 1 x_abs = abs(x) reversed_num = 0 while x_abs > 0: pop = x_abs % 10 x_abs //= 10 # 溢出检查 if reversed_num > (INT_MAX - pop) // 10: return 0 reversed_num = reversed_num * 10 + pop result = sign * reversed_num return result if INT_MIN <= result <= INT_MAX else 0 ``` #### 字符串转换法(LeetCode不推荐) 适用于简单场景但不符合算法题要求: ```python def reverse_with_string(x): sign = -1 if x < 0 else 1 reversed_str = str(abs(x))[::-1].lstrip(&#39;0&#39;) result = sign * int(reversed_str) if reversed_str else 0 return result if -2**31 <= result <= 2**31-1 else 0 ``` #### 测试用例 ```python print(reverse_integer(123)) # 输出321 print(reverse_integer(-123)) # 输出-321 print(reverse_integer(120)) # 输出21 print(reverse_integer(0)) # 输出0 print(reverse_integer(1534236469)) # 输出0(溢出) ``` #### 关键点说明 1. **符号处理**:先统一转为正数处理,最后恢复符号[^4] 2. **溢出检查**:在每次乘以10之前预判是否超过INT_MAX//10 3. **尾零处理**:数学方法自动忽略前导零 4. **时间复杂度**:$O(\log_{10}(x))$,与数字数正相关
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steelDK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值