[Leetcode] Palindrome Number 回文数

343 查看

Palindrome Number

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

首尾比较法

复杂度

O(Length) 时间 O(1) 空间, Length为所求Integer的长度

思路

  1. 先求Integer (记为x) 的长度len

  2. 根据长度制造掩码 (mask)

  3. 循环当:当最高位等于最低位 && x还有数字等待判断(x != 0)

    1. 最高位通过掩码和整除取得(646/100=6),最低位通过取余取得(646%10=6)

    2. 判断过后更新掩码(mask/=100),删掉最高位(x%=mask),删掉最低位(x/=10)

注意

求Integer长度的utility:

int len = 0;
while (x != 0) {
    len++;
    x /= 10;
}
return len;

如何取得一个Integer的最高位?假设x = 688
答:x / mask. 设置一个和x位数一样的mask,mask = 100,然后用x/mask,表示x里面有几个mask,即是最高位数字. 688里有6个100,即为6.

如何删去一个Integer的最高位?假设x = 688
答:x = x % mask. 还是用这个mask,用 x = x % mask 即可得到688除以100的余数,这个余数其实等于删掉了x的最高位剩下的数.

如何取得一个Integer的最低位?假设x = 688
答:x % 10.

如何删去一个Integer的最低位?假设x = 688
答:x = x / 10.

代码

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0)
            return false;
        int len = getIntegerLength(x);
        int mask = (int)Math.pow(10, len - 1);
        while (x != 0) {
            if (x % 10 != x / mask)
                return false;
            x %= mask;  //去最高位
            x /= 10;    //去个位
            mask /= 100;    //mask要丢掉两个零,不是一个!
            
        }
        return true;
    }
    public int getIntegerLength(int x) {
        int len = 0;
        while (x != 0) {
            x /= 10;
            len++;
        }
        return len;
    }
}