-
题目: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