7.整数翻转

  • 题目:7.整数翻转
    把一个int值翻转输出,若翻转后溢出int,就返回0;
    不能使用64位整数;

  • 思路:
    本题麻烦在溢出如何处理;
    本题不能使用64位整数,因此不能用long,只能在int上下功夫;

1.溢出前检查:时间O(log10 x):循环x的位数次,空间O(1)
通常对一个数组转化成数字,res = res * 10 + nums[ i ]是从高位往低位遍历;
本题要把整数翻转,例如1234,刚好把4理解成高位,就可以按上式计算倒过来的值,这样好的一点是,像123000这样的数,不用额外考虑前导0的问题;

//核心:先检测再更新,就不会真的溢出int了
class Solution {
    
    
public:
    int reverse(int x) {
    
    
        int res = 0;
        while (x) {
    
    
            int tmp = x % 10;
            x /= 10;
            if (res > INT_MAX / 10 || (res == INT_MAX && tmp > 7)) return 0; //上溢出前检测
            else if (res < INT_MIN / 10 || (res == INT_MIN && tmp )) return 0;//下溢出前检测
            res = res * 10 + tmp;
        }

        return res;
    }
};

2.笨办法:利用数组翻转:时间O(log10 n):,O(log10 n):额外一个长为x的位数的数组

class Solution {
    
    
public:
    int reverse(int x) {
    
    
        long xx = x;
        bool isnegative = false;
        if (xx < 0) isnegative = true, xx = -xx;//防止x取INT_MIN时,取相反数溢出

        vector<int> res;
        while (xx) res.push_back(xx % 10), xx /= 10;

        long ans = 0, i = 0;
        while (i < res.size() && res[i] == 0) ++i;//跳过前导0
        for (; i < res.size(); ++i) ans = ans * 10 + res[i]; 

        if (ans > INT_MAX) return 0;//先按整数算,最后考虑符号
        else return isnegative ? -ans : ans;
    }
};

3.牛逼,利用强制类型转换:时间O(log10 n),空间O(1)

class Solution {
    
    
public:
    int reverse(int x) {
    
    
        long ans = 0;  //注意是long类型
        while (x! = 0){
    
    
            ans = ans * 10 + x % 10;
            x = x / 10;
        }
        return (int)ans == ans ? (int)ans : 0;//小端序,比较低32位,若相同说明没溢出
    }
};
  • 总结:
    方法1需掌握,方法3牛B

猜你喜欢

转载自blog.csdn.net/jiuri1005/article/details/114994011