-
トピック: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です。