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判题确实严格,一点溢出都不能有,如果不考虑溢出,应该挺简单的