小目标 To be or not to be

Leetcode 009 Palindrome Number

2017-03-13
chaowyc

Leetcode 009 题

Difficulty:Easy

Tag: Math

题目

题目原址:https://leetcode.com/problems/palindrome-number/#/description

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

思路分析

判断一个整数是不是回文数,有两个直观的思路

  1. 转换成字符串处理,然后利用字符串的反转操作即可.
  2. 整数反转,循环取模乘以10.

直观上说,思路1更简单,但是,题目限制了 不适用额外的空间 . 也就是要求空间复杂度为O(1), 而思路1的空间复杂度是O(n).

代码

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0) return false;
        int palindrome = 0;
        int tmp = x;
        while(x != 0)
        {
            palindrome = palindrome * 10 + (x % 10); 
            x = x / 10;
        }
        return palindrome == tmp;
    }
};

代码-优化

将上段代码优化。 思路,根据回文数字的特性,反转一半得到的数或者得到的数的除以10的结果和剩下的数应该相等, 因为存在回文数的位数是奇数还是偶数的问题。

下面的例子可以清楚的解释

当 回文数的位数是偶数时,
124421 回文数
反转一半,此时 
palindrome = ((1 * 10 + 2) * 10) + 4 = 124
x = 124
当 回文数的位数是奇数时,
12421 回文数
反转一半
palindrome = ((2 * 10 + 1) * 10) + 4 = 124 / 10 = 12
x = 12


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

Similar Posts

Comments