【LeetCode刷题记录】9. Palindrome Number

Description:

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

这道题目实现并不难,但题目要求空间复杂度为O(1), 有一定的技巧性。

Solutions:

Solution 1:

public boolean isPalindrome(int x) {
        int palindromeX = 0;
        int inputX = x;
        while(x>0){
            palindromeX = palindromeX*10 + (x % 10);
            x = x/10;
        }
        return palindromeX==inputX; 
    }

受到LeetCode 7.Reverse Integer 的启发,将原int型的数据完全反转后,比较反转后的数据与原数据是否相同,相同则为回文,反之不是。

Question:这个算法没有考虑到int型数据反转后可能存在的溢出情况,是不是有错误?
Answer: 若反转后的数据比原数据大,那么它一定与原数据不相同,肯定不是回文了,所以这个算法隐性地排除了溢出的情况。

但进一步思考,判断是否为回文需要将整个数字完全反转吗?反转到一半不久可以进行比较了吗?这就引出了Solution 2。

Solution 2:

bool isPalindrome(int x) {
        if(x<0|| (x!=0 &&x%10==0)) return false;
        int sum=0;
        while(x>sum)
        {
            sum = sum*10+x%10;
            x = x/10;
        }
        return (x==sum)||(x==sum/10);
    }

这个算法要额外考虑能被10整除的数,需要特别注意。

Solution 3:

bool isPalindrome(int x) {
          //negative number
          if(x < 0)
              return false;

          int len = 1;
         while(x / len >= 10)
             len *= 10;

         while(x > 0) {  
             //get the head and tail number
             int left = x / len;
             int right = x % 10;

             if(left != right)
                 return false;
             else{
                 //remove the head and tail number
                 x = (x % len) / 10;
                 len /= 100;
             }
         }       
         return true;
     }

解题思路: 每次提取头尾两个数,判断它们是否相等,判断后去掉头尾两个数。

你可能感兴趣的:(LeetCode)