leetcode-整数反转

前言:

本来应该是昨天就写的,可以寝室没电,电脑罢工没法写。不过今天要和我们家领导说声对不起,最近的表现真的太糟糕,无论什么方面都是这么糟糕。我要好好调整自己的心态。你是第一位,说什么都没有用,错了就是错了,错了就改。我会加油让你成为世界上最幸福的人,不过我才是最幸福的,因为我有你。
言归正传,这道题目还是相对简单,思路比较容易。

题目:

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -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 显然//做除法是取整都是向下即(无穷小方向)取整,所以并不是我们想要的,想要在负数做完除法后进行加一得到我们想要的结果。

python负数除法与取余

赏瓶可乐吧(*^▽^*)