题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
解法一
转换为字符串判断是否为回文字符串。
class Solution {
public boolean isPalindrome(int x) {
if(x < 0) {
return false;
}
String str = String.valueOf(x);
int length = str.length();
for(int i = 0; i < length / 2; i++) {
if(str.charAt(i) != str.charAt(length - 1 - i)) {
return false;
}
}
return true;
}
}
解法二
分解出数字的每一位,转换为数组再进行判断
class Solution {
public boolean isPalindrome(int x) {
if(x < 0) {
return false;
}
int[] digit = new int[10];
int i = 0;
while(x > 0) {
digit[i++] = x % 10;
x = x / 10;
}
for(int j = 0; j < i / 2; j++) {
if(digit[j] != digit[i - 1 - j]) {
return false;
}
}
return true;
}
}
解法三 只反转一半数字进行比较
前两种方法一是使用了转换字符串,二使用了额外数组。其实还有一种更好的解法。我们可以只对数字的后一半位数进行反转,反转后如果和前一半保持一致则说明是回文数字。
众所周知,可以使用除10取余数+除10的方式来获取最后一位数字。那么我们如何判断已经转换了一半的位数呢?其实在转换的过程中,结果数字是在不断变大的,原数字却在不断变小。当原数字小于等于结果数字时说明转换了一半\或一半加1个(位数位奇数的情况)。
另外需要注意的是,上述求反转数字的过程。对于10的倍数是不必要(10的倍数除了0都不是回文数字),且在最后一步进行位数位奇数的特殊处理时容易出错。所以可以将10的倍数和负数一样作为特殊情况进行处理。
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revert = 0;
while(x > revert) {
revert = revert * 10 + x % 10;
x = x / 10;
}
return (revert == x) || (revert / 10 == x);
}
}