这两个一起记录是因为有共性,涉及将一个数字反转,
这个操作可以通过转换成字符串来处理,但是这样效率比较低也不是题目本意。
题目本意是如何处理数字的溢出。
32位整型的范围为 -2^31 ~ 2^31-1 超出这个范围会溢出。
先看7的代码:
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0; //正数溢出处理
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0; //负数溢出处理
rev = rev * 10 + pop;
}
return rev;
}
};
会溢出的情况为
正数时:
1.rev * 10 > INT_MAX
2. rev* 10 == INT_MAX 且 个位数 > 7
负数时
1.rev * 10 < INT_MIN
2. rev* 10 == INT_MIN 且 个位数 > 8
这既是上面这段代码处理溢出的原理,这个 个位数是就是int最大值和最小值的个位
这个在9 回文数中也有体现:
bool isPalindrome(int x) {
if (x < 0) return false;
int tmp = x;
int res = 0;
int index = 1;
while(tmp != 0)
{
int pop = tmp%10;
if (index == 1)
{
res = pop;
}
else
{
if (res > INT_MAX/10 || (res == INT_MAX && pop > 7)) return false; //检测到溢出,肯定不是回文数
res = res * 10 + pop;
}
index++;
tmp/= 10;
}
return (x == res);
}