本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的。
建议您在PC浏览器中阅读本文。
如果您未掌握知识提要中的内容,建议您先掌握这些内容之后再阅读本文。
知识提要
1、内置函数str和int
2、基本序列类型之str和list
3、切片(slicing)
0
问题描述
实现一个函数,给定一个整型数字,将这个数字反转。例如,输入123,返回321;输入-456,返回654;输入110,返回11,……
在Python3中,整型的最大值并没有理论的上限,所以我们不考虑数值溢出的问题。
“整型数值”和“数字”是紧密相连,而又有所不同的概念。但哪怕是将它们互换,也不影响对本文的理解。为了行文方便,我将直接使用“数字”这个词。
你可以在力扣提交测试这道题目的代码:
1
借助字符串
最直观,而且最容易理解的解题方案是:将数字转为字符串,将字符串反转,再转回数字。Python3为我们提供了两个内置函数,str能int,前者能把数字转为字符串,而后者则可以将字符串转为数字。
def reverse(n):
sign = 1 # 记录数字的符号
if n < 0:
sign = -1
n = -n
s = str(n) # 转为字符串
s = s[-1::-1] # 字符串反转(中间有两个冒号哦)
n = int(s) # 转为数字
return sign * n然而,函数str在将数字转为字符串的过程中,实际上是将数字的每个位拆开,转为对应的字符,然后将这些字符拼装在一起,得到最终的结果。例如调用str(123),实际上是将123转为字符系列(‘1’, ‘2’, ‘3’),再将它们拼接成字符串‘123’。
2
手动拆解数字
虽然,我们借助字符串,可以写出非常简洁直观的代码,但程序运行阶段却做了一些没有必要有重复运算。
实际上,我们可以模拟str函数拆解数字的过程,得到数字的每一个位。然后我们再将这些数位通过数学计算,拼接成最终的结果。
拆解和拼接原理如下所示:
123 = ((1 * 10) + 2) * 10 + 3
123 => [1, 2, 3]
321 = ((3 * 10) + 2) * 10 + 1如下的代码实现,就是根据这个拆解和拼接的原理而来的。
def reverse(n):
sign = 1 # 保存数字的符号
if n < 0:
sign = -1
n = -n
digits = [] # 从低到高存储数字n的每个位
while n != 0:
# r保存当前最低的位,n保存待处理的数字
# 假如n==123,则运行如下代码之后,r==3, n==12
r, n = n % 10, n // 10
digits.append(r)
n = 0
for r in digits:
# r, n = n % 10, n // 10 的逆过程
n = n * 10 + r
return n * sign3
将拆解和拼装过程合并
事实上,我们并不需要将拆解的数位单独存储起来。在拆解数字的每个位的过程中,就可以将这些位拼装到目标数字上去。这样,可以大大简化我们的代码。
def reverse(n):
sign = 1 # 保存数字的符号
if n < 0:
sign = -1
n = -n
ret = 0
while n != 0:
# r保存当前最低的位,n保存待处理的数字
# 在ret中,越低位的r被乘10的次数越多,于是达到反转的效果
r, n = n % 10, n // 10
ret = ret * 10 + r
return ret * sign
















