题目:Palindrome Number

Determine whether an integer is a palindrome. Do this without extra space.

分析:由于题目已经要求不能使用额外空间,故不可以把数字转换为字符串s,然后对s取反得到s',判断两字符串是否相等。解决方案是用循环直接将数字取反,最后将得到的新数字与原始数字比较。

public class Solution {
    public boolean isPalindrome(int x) {
        int a = x, r = 0;

        if (x < 0) return false;

        while (a > 0) {
            r = r*10 + a%10;
            a = a / 10;
        }

        return r == x;
    }
}

提交了,也通过了。但似乎总感觉有点问题,什么问题呢?上述方案没有考虑翻转后的数字溢出的问题,当r*10大于2^31-1时,截断其高位很可能会得到一个跟原始x接近的值,再加上a%10就刚好等于原始x了。(当然这只是一种顾虑,估计即便暴搜后也不见得能找到符合条件的数字)。如果题目再加一条约束说:不允许计算中出现溢出呢?

我们知道对于任意n位的数字,取n=5,数字95349为例

95349 % 10 => 9
95349 / 10000 => 95349 / 10^4 => 9

可以看出我们可以通过模10来取其最低位,除10^(n-1)来取其最高位,将其最高位和最低位进行比较,便可以得出当前是否符合回文要求了。

比较完最高位和最低位后,如何除掉这两位呢?

95349 % 1000 => 95349 % 10^4 = 5349
95349 / 10 = 9534

如此一来,便完成了掐头去尾了。

完整代码:

public class Solution {
    public boolean isPalindrome(int x) {
        int a = x, h = 1;

        if (a < 0) return false;

        while (a / h >= 10) {
            h = h * 10;
        }

        while (a > 0) {
            if (a / h != a % 10) return false;
            a = a % h;
            a = a / 10;
            h = h / 100;
        }

        return true;
    }
}

ssnau
1.5k 声望98 粉丝

负能量职业打码师


引用和评论

0 条评论