前言:
本来应该是昨天就写的,可以寝室没电,电脑罢工没法写。不过今天要和我们家领导说声对不起,最近的表现真的太糟糕,无论什么方面都是这么糟糕。我要好好调整自己的心态。你是第一位,说什么都没有用,错了就是错了,错了就改。我会加油让你成为世界上最幸福的人,不过我才是最幸福的,因为我有你。
言归正传,这道题目还是相对简单,思路比较容易。
题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0
方法一
思路:
因为目前主攻的语言是python,所以一般都是用python来刷题。有时间也会用C++再写一遍。这道题的话,一个最简单的思路就是先转字符串,然后将字符串倒序。
代码:
class Solution:
def reverse(self, x: int) -> int:
if x >= 0:
reversed_x = int(str(x)[::-1])
else:
reversed_x = -int(str(x)[:0:-1])
if -2 ** 31 < reversed_x < 2 ** 31 - 1:
return reversed_x
else:
return 0
结果:
执行结果还不错,72ms。不过还是有接近40%的人用的方法比这个快
方法二
思路:
这个方法就是用一个数学的思想,对输入数x不断取余,获取最后一位数字,存入记录数num,然后将x除以10,将最后一位砍断。并将num增大,同时判断是否溢出。代码中也会给出注释。
代码:
class Solution:
def reverse(self, x: int) -> int:
max = 2**31 - 1
min = -2 ** 31
num = 0
if x < 0 : #判断是否是负数
is_minus = True
else:
is_minus = False
while x != 0:
if is_minus :#由于python对负数的运算机制问题,所以正数与负数取余与除法操作不同
if x % 10 == 0:
index = x % 10#python的一些负数取余除法操作会在下面进行介绍
x = x // 10
else:
index = 10 - x % 10
x = x // 10 + 1
if num <min // 10 or (num == min // 10 and index < min % 10):#判断溢出
num = 0
break
else:
num = num * 10 + index * -1
flag = False
else:
index = x % 10 #取最后一位数字
x = x // 10 #去除x的最后一位
if num > max // 10 or (num == max // 10 and index > max % 10):#判断溢出
num = 0
break
else:
num = num * 10 + index #将num增大
return num
结果:
执行时间为56ms,感觉速度还不错。不过最主要的就是上文一直提到的负数取余除法机制问题,这也是写题过程中让我困惑的地方。
python负数除法与取余:
在Python中,取余的计算公式与别的语言并没有什么区别:r=a-n*[a//n]
这里r是余数,a是被除数,n是除数。
不过在“a//n”这一步,当a是负数的时候,我们上面说了,会向下取整,也就是说向负无穷方向取整。这也就得到:
-123%10 = -123 - 10 (-123 // 10) = -123 - 10 (-13) = 7
所以代码中我会对负数取余后的数字进行一个减法,不过可以直接对-10取余也是可以的。而对于python的取整,123//10=12 -123//10=-13 显然//做除法是取整都是向下即(无穷小方向)取整,所以并不是我们想要的,想要在负数做完除法后进行加一得到我们想要的结果。