【LeetCode-数学】整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例:

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

题目链接: https://leetcode-cn.com/problems/reverse-integer/

思路

题目的难点在于反转过程中整数可能溢出,所以在反转过程中要判断是否溢出。有符号int的范围为-2147483648到2147483647,所以有两种情况会溢出(假设当前反转的结果为ans,输入为x, MAX_VALUE=2147483647, MIN_VALUE=-2147483648):

  • ans > MAX_VALUE/10 || (ans==MAX_VALUE/10 && x%10>7) // x>=0
  • ans < MIN_VALUE/10 || (ans==MIN_VALUE/10 && x%10<-8) // x<0

有一点需要注意,上面的条件中ans > MAX_VALUE/10不能写成ans*10 > MAX_VALUE,因为ans*10可能会超过int的表示范围从而出现runtime error。
代码如下:

class Solution {
public:
    int reverse(int x) {
        
        int MAX_INT = 0x7fffffff;
        int ans = 0;
        bool isNegative = x<0? true:false;
        x = abs(x);
        while(x>0){
            if(ans>MAX_INT/10 || (ans==MAX_INT/10 && x%10>7)) return 0;
            ans = ans*10 + x%10;
            x /= 10;
        }
        if(isNegative) ans = -ans;
        return ans;
    }
};

在上面的代码中,将数取绝对值统一转为正数后判断。

  • 时间复杂度:O(n)
    n为数字的长度(lgx)。
  • 空间复杂度:O(1)

这题还有一点需要注意,下面的写法虽然能通过,但是是不对的,因为题目假设环境只能存储得下 32 位的有符号整数,而代码却使用了long:

class Solution {
public:
    int reverse(int x) {
        
        int MAX_INT = 0x7fffffff;
        long ans = 0;
        bool isNegative = x<0? true:false;
        x = abs(x);
        while(x>0){
            ans = ans*10+x%10;
            x/=10;
            if(ans>MAX_INT) return 0;   // 溢出
        }
        if(isNegative) ans = -ans;
        return ans;
    }
};
posted @ 2020-04-26 17:47  Flix  阅读(132)  评论(0编辑  收藏  举报