回文数
算法描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。 -121不是回文,因为 从右向左读, 为 121-
提示:不用将整数转换成字符串处理。
算法实现
java
public boolean isPalindrome(int x) {
if(x<0) {//因为负数肯定不是回文数
return false;
}
int reversX=reverse(x);
return reversX==x;
}
//数字翻转
public int reverse(int x) {
int res = 0;
int MAX = Integer.MAX_VALUE;//2147483647
while (x != 0) {
int digit = x % 10;//取当前最后一位数字,比如12345取5
x = x / 10;// 去掉最后一位,比如12345变成1234
// 预判溢出,如果 res * 10 + digit > MAX
if (res > MAX / 10 || (res == MAX / 10 && digit > 7)) {
return 0;
}
res = res * 10 + digit;
}
return res;
}
算法解析
避坑提醒
- 不能先算 res*10+digit 再比较,因为可能会超出 int 范围会发生数值截断,判断失效;
- 不能用 long 中转(部分面试要求纯 int 运算,不允许更大类型);
溢出判断
java
MAX = 2147483647
MAX / 10 = 214748364
情况 1:res > MAX / 10
设 res = 214748365
res * 10 = 2147483650
哪怕 digit = 0,结果是 2147483650
2147483650 > 2147483647,一定溢出
这里的逻辑是:
res 只要大于 214748364,res×10 本身就已经大于 MAX,再加任何 0~9 的 digit,只会更大,必然溢出。
情况 2:res == MAX / 10
res*10 = 2147483640
digit ≤7:2147483640 + digit ≤ 2147483647,安全
digit ≥8:2147483640 + digit ≥ 2147483648,溢出
情况 3:res < MAX / 10
res×10 最大为 2147483630,加 9 也只有 2147483639 < MAX,永远安全