题目
Determine whether an integer is a palindrome. Do this without extra space.
这种回文类型的题目以前都是做过的,比如字符串是否回文,一般的算法如下:
public boolean isPalindrome(String x) {
char[] chars = x.toCharArray();
for (int i = 0, j = chars.length -1; i < j; i++, j--) {
if (chars[i] != chars[j]) {
return false;
}
}
return true;
}
定义两个指针i和j,一个指向前端,往后移;一个指向末端,往前移。终止条件就是两个即将重叠,或者中间有一个数字。
在看本题,加了严格的要求。不能使用额外的空间,所以第一反应将其转化为字符数组的方案就被堵死了。另外一个思路就是讲数字倒序,比较两个数字是否相等。将整型倒序的代码如下:
public int reverse(int x) {
long result = 0;
while (x != 0) {
result = result * 10 + x % 10;
x /= 10;
}
return result > Integer.MAX_VALUE || result < Integer.MIN_VALUE ? -1 : (int)result;
}
为了防止倒序之后整型逸出,上面做了一些处理,比如使用long值,逸出时返回-1。所以根据上述方法,本题可以这样解题:
public boolean isPalindrome(int x) {
if (x < 0)
return false;
int reverse = reverse(x);
if (reverse < 0) {
return false;
}
return x == reverse;
}
此方法肯定可以,但是是不是够简洁,可以优化的。可以先看字符串那个示例,当然他也可以采取把字符串倒序之后比较,但是明显上面那两个指针的方法更简洁高效。同理,这个可以不以值倒序一部分呢?
public boolean isPalindrome(int x) {
if (x < 0 || x != 0 && x % 10 == 0)
return false;
int y = 0;
while (y < x) {
y = y*10 + (x%10);
x /= 10;
}
return (x == y || y / 10 == x ? true : false);
}
代码精炼了不少,并且也不会出现逸出的现象