题目的主要信息:

  • 给定一个32位的有符号整数num,将num中的数字部分反转
  • 只反转数字部分,符号位部分不反转
  • 最后的结果需要在32位有符号数范围之内,超出范围返回0

方法一:取模反转

具体做法:

数对10取余可以得到数字最后一位,将最后一位加在答案数字最前面,然后数除10即可去掉最后一位数字,后续继续取余,添加到答案数字后,答案数字添加前先乘10,空出最后一位给要加的数字,如图所示:

因此对答案数字乘10加上余数后可能会超过范围,因此在乘10之前要比较答案数字是否超过了INT型整数最大最小值的1/10,处理溢出。

alt

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while(x){
            int mod = x % 10; //取最低位数字
            x /= 10; //去掉最低位数字
            if(res > INT_MAX / 10 || res < INT_MIN / 10) //处理溢出
                return 0;
            res = res * 10 + mod; //低位数字在前组装
        }
        return res;
    }
};

复杂度分析:

  • 时间复杂度:O(log10n)O(log_{10}n),相当于连除十进制数字的位数,而位数就是取10的对数
  • 空间复杂度:O(1)O(1),常数级变量,无额外空间

方法二:python字符串反转

具体做法:

可以使用python将数字转成字符串,然后对字符串进行反转,添加符号后转回int型数字,因此python的int数字不会越界,此时比较数字是否在32位有符号数范围内,如果在正常输出,否则输出0.

class Solution:
    def reverse(self , x: int) -> int:
        s = str(abs(x)) #数字转字符串
        s = s[::-1] #字符串反转
        if x < 0: #判断正负
            s = '-' + s
        res = int(s) #字符串转数字
        if res >= (-2 ** 31) and res <= (2 ** 31 - 1): #合法范围内
            return res
        else:
            return 0

复杂度分析:

  • 时间复杂度:O(log10n)O(log_{10}n),字符串长度相当于十进制数字的位数,而位数就是取10的对数,一次反转字符串,因此为O(log10n)O(log_{10}n)
  • 空间复杂度:O(log10n)O(log_{10}n),使用了数字位数为长度的字符串空间