LeetCode 刷题【7. 整数反转】

7. 整数反转

自己做

解1:求数累加

【LeetCode中不允许溢出操作,要在溢出前判断是否溢出】

cpp 复制代码
class Solution {
public:
    int reverse(int x) {

        //cout << x << endl;

        int reverse_x = 0;      //反转数
        int number;            //x的位数【10的多少次方可以取出x】
        int div_num = 1;       //除数
        int multi_num = 1;     //乘数

        //首先判断x有多少位【2的10次方是1024】
        for (int i = 1; i <= 10; i++) {                     
            if ((x == std::numeric_limits<int>::min() && div_num == 1)) {      //最小值的边界情况【div要从10开始,比如又会报错】
            
            }
            else if (abs(x / div_num) < 10) {     //找到对应位数,退出循环【为防止除数越界,不用等于0的判断】
                    number = i;             
                    break;
                }
            div_num *= 10;
        }

        //求出各位数字
        for (int i = 0; i < number; i++) {

            //判断乘法溢出,迎合LeetCode,LeetCode不允许出现溢出
            //if (multi_num > std::numeric_limits<int>::max() / 10 && x > 0)
            //    return 0;
            //if (-multi_num < std::numeric_limits<int>::min() / 10 && x < 0) {
            //    return 0;
            //}

            int old = reverse_x;
            int add = (x / div_num) % 10 * multi_num;      //累加的数
            reverse_x += add;     //不会溢出则累加

            //判断结果是否溢出,溢出了就直接返回0
            if (reverse_x % multi_num != old)
                return 0;

            div_num /= 10;
            //迎合LeetCode,LeetCode不允许溢出操作
            if (i != number -1)
                multi_num *= 10;
            
        }

        return reverse_x;

    }
};

看题解

题解和我反着来,累加的数一直是个位的,这样就避免了溢出的问题(判断下个数是否溢出)

cpp 复制代码
class Solution {
public:
    int reverse(int x) {
        int res = 0;

        while (x != 0) {
            int temp = x % 10;

            if (res > std::numeric_limits<int>::max() / 10 || (res == std::numeric_limits<int>::max() / 10 && temp > 7))
                return 0;

            if (res < std::numeric_limits<int>::min() / 10 || (res == std::numeric_limits<int>::min() / 10 && temp < -8))
                return 0;

            res = res * 10 + temp;
            x /= 10;
        }

        return res;

    }   

};

今日总结

LeetCode判题确实严格,一点溢出都不能有,如果不考虑溢出,应该挺简单的