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