要求:在不使用额外空间的前提下,判断一个数字是否是回文数字,例如12321是回文,1234521不是回文
回文数字的最大特征就是最后一个数字和第一个数字相等,由此可以得出两个特征
1、回文数字反转之后,跟反转之前的值相等
2、回文数字首尾是对称的
基于上述两个特征,可以衍生下面三个算法
/*
* 解法一: 将数字反转,只需要判断反转前后是否相等即可 但是需要注意,如果数字过大可能导致溢出的问题
*/
public int reverseNumbers(int number) {
assert (number >= 0);
int rev = 0;
while (number != 0) {
rev = rev * 10 + number % 10;
number /= 10;
}
return rev;
}
/*
* 解法二:一次比较数字的头和尾,如果相等,去掉头和尾,再进行比较
*/
public boolean isPalindrome(int x) {
if (x < 0)
return false;
int div = 1;//记录数字的单位
while (x / div >= 10) {
div *= 10;
}
while (x != 0) {
int l = x / div;//获取x的头
int r = x % 10;//获取x的尾
if (l != r)
return false;
x = (x % div) / 10;//除去x的头和尾
div /= 100;//位数减两位
}
return true;
}
/*
* 解法三: 如果在栈空间不算额外空间的条件下,可以使用递归的解法
*/
boolean isPalindrome(int x, int y) {
if (x < 0)
return false;
if (x == 0)
return true;
/*
* 先找到递归找到x的头,然后再递归找到y的尾,进行比较
*/
if (isPalindrome(x / 10, y) && (x % 10 == y % 10)) {
y /= 10;
return true;
} else {
return false;
}
}