LeetCode题目笔记--7.整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目解读及思路

  反转题整数,这种题目我记得应该在刚学编程的作业里出现过,但当时没有具体要求,不想这里有具体的要求。

思路

  整个思路很简单,从后往前遍历这个整数,用一个变量res记录结果,初始为0每次循环中用res乘以10加上最低位,直到所有位上的数都遍历完。

  从后往前遍历可以用两种方法来实现,一是每次循环中,用%10得到最低位,然后将输入整数除以10,适合C/C++,Java;二是将输入整数看作一个整数字符串,从后往前以下标来遍历,适合字符串操作比较方便的语言,如python,Java,C++;

  当然,如果使用python实现的话,可以不用在循环内部每次判断是否溢出,在全部计算完再判断也可,(至于越界过后的继续运算开销和每次计算都判断越界的开销谁大,我不清楚,可以弄很多数据来测一测)。而C/C++或Java则需要注意,要在循环内更新res前判断是否溢出。

可能的坑!

  这里的坑都是语言方面的问题,对语言不是非常熟悉的话可能会遇到。
  若是用第一种方法来实现,且用python来写的话,需要注意一点就是如果输入整数是负数的话,不能对10进行取余而是需要对-10取余,至于为什么,这就涉及到python底层取余%运算的实现逻辑了,感兴趣的朋友可以自己试试,查阅资料了解了解。还有就是除以10的运算,也不能直接用“/”运算符,这样的计算结果会是小数,应该使用”//“运算符
  所以,如果用python的话,就得判断两种情况分别对10和-10取余,当然也可以另辟蹊径,在循环开始前将负数取反,或者其他方法。

C语言代码

int reverse(int x){
     
    int t, res;
    res = 0;
    int INT_max = INT_MAX / 10;
    int INT_min = INT_MIN / 10;
    while (x != 0)
    {
     
        t = x % 10;
        if((res > INT_max) || (res == INT_max && t > 7))
            return 0;
        if((res < INT_min) || (res == INT_min && t < -8))
            return 0;
        res = res * 10 + t;
        x /= 10;
    }
    return res;
}

  判断越界的代码是参考的官方题解里的,之前的比较繁琐。这个代码运行时间是0ms,其实头文件里的INT_MAX和INT_MIN除以10后都是一样的,于是我把第四句INT_min写成-INT_max,没想到运行时间还多了8ms,或许是在补码上进行取反操作时的开销比除法大吧。

python代码

class Solution:
    def reverse(self, x: int) -> int:
        res = 0
        INT_max = 214748364
        INT_min = -214748364
        flag = False
        if x < 0:
            x = -x
            flag = True
        while x != 0:
            temp = int(x % 10)
            if (res > INT_max) or (res == INT_max and temp > 7):
                return 0
            if (res < INT_min) or (res == INT_min and temp < -8):
                return 0
            res = res * 10 + temp
            x //= 10

        if flag:
            return -res
        else:
            return res

  这个代码运行时间48ms,确实慢。

python实现-方法2

class Solution:
    def reverse(self, x: int) -> int:
        s = str(x)
        res = 0
        size = len(s)
        for i in range(-1, -size - 1, -1):
            if s[i] == '0':
                res *= 10
                continue
            elif s[i] == '-':
                res = -res
                break
            res = res * 10 + int(s[i])
		
        if res > 2**31 - 1:
            return 0
        elif res < -2**31:
            return 0
        else:
            return res

  这个代码运行52ms,不知道为啥,同样的思路,会有运行20几ms的示例,我把24ms的运行示例也提交了一次,竟然还是48ms。我。。。。
LeetCode题目笔记--7.整数反转_第1张图片
有点玄学,不管了,就这样吧。

你可能感兴趣的:(C/C++,LeetCode,python实战,python,leetcode,算法,c++)