[LeetCode From Day One] - 9. Palindrome number


本题是LeetCode简单难度第九题回文数,这里仍然先给出题目与相应的提示与要求。

给定一个整数x,判断其是否位回文数。
Example:
    Input: 121
    Output: true
能否在不转为字符串的情况下实现(额外的存储空间)?

鉴于Reverse Integer这篇文章中介绍了如何反转一个数组,这里很容易就能想到的方法就是比较反转前与反转后的数字。

public class Solution
{
    public bool IsPalindrome(int x)
    {
        if (x < 0)
            return false;
        else if (x == 0)
            return true;
        else
        {
            int tmp = x;
            int reverse = 0;
            while (x != 0)
            {
                reverse = reverse * 10 + x % 10;
                x = x / 10;
            }
            if (reverse == tmp)
                return true;
            else
                return false;
        }
    }
}

然而,文章中也提到了反转后溢出的问题。所以本题应该是一个更通用的解法。

Solution

首先我们可以发现一个负数不可能是一个回文数,因为负号的存在。0是一个回文数。对于一个正整数,我们可以根据回文数定义(正反排列相等),每次比较头部与尾部数字是否相等。 直接上代码:

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        else if(x == 0) {
            return true;
        }
        int len = 1;
        while(x/len >= 10) {
            len *= 10;
        }

        while( x!=0 ) {
            //left == right
            if(x/len != x%10) {
                return false;
            }
            //掐头去尾
            x = (x % len) / 10;
            len /= 100;
        }
        return true;
    }
}

第一个while循环计算整数x的长度,若x=121,则len=100。计算len的作用是为了每次能取出最左边的数字,只需要用x对len取整即可。第二个while中的if条件就是在判断头部跟尾部是否相等,若相等,则x = (x % len) / 10;得到掐头去尾后的x。

  #LeetCode 

[LeetCode From Day One] - Two Pointers »