Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Easy (57.25%) | 977 | - |
我的答案
public boolean isPalindrome(int x) {
// 解一: 转成字符串
// String s = String.valueOf(x);
// int length = s.length()-1;
// for(int i=0; i<s.length()/2; i++){
// if(s.charAt(i) != s.charAt(length)){
// return false;
// }
// length--;
// }
// return true;
// 解二
if(x<0){
return false;
}
int len = 1;
while(x/len >= 10){
len*=10;
}
while(x != 0){
if(x%10 != x/len){
return false;
}
x%=len;
x/=10;
len/=100;
}
return true;
}
解题思路
解一
- 转成字符串判断,这是简单的
解二
- 取最高位和最低位比较,比完掐头去尾继续比
- 最低位用 x % 10 取
- 最高位,先算出位数 len,再用 x % len 取
- 注意,掐头去尾后,len 变化是 102
答案分析
无
参考方案
- 首先,负数和末尾为零(除 0 外)不可能是回文
- 如果是回文,把它的后半部分反转,肯定等于前半部分
- 因为前半部分一直在除以十,而半部分一直在乘以十,所以当后半部分大于前半部分时,说明反转到一半了
- 如果最后得到的 right 为奇数位,比如 123,那把最后一位去掉就行
public boolean isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)){
return false;
}
int right = 0;
while(x > right){
right = right * 10 + x % 10;
x/=10;
}
return x == right || x == right / 10;
}
时间复杂度 O(log10n)
空间复杂度 O(1)
备注
无