9. Palindrome Number

Description

Given an integer x, return true if x is a palindrome, and false otherwise.

 

Example 1:

Input: x = 121
Output: true
Explanation: 121 reads as 121 from left to right and from right to left.

Example 2:

Input: x = -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.

Example 3:

Input: x = 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

 

Constraints:

  • -231 <= x <= 231 - 1

 

Follow up: Could you solve it without converting the integer to a string?

Solutions

Solution 1: Reverse Half of the Number

First, we determine special cases:

  • If x<0x < 0, then xx is not a palindrome, directly return false;
  • If x>0x > 0 and the last digit of xx is 00, then xx is not a palindrome, directly return false;
  • If the last digit of xx is not 00, then xx might be a palindrome, continue the following steps.

We reverse the second half of xx and compare it with the first half. If they are equal, then xx is a palindrome, otherwise, xx is not a palindrome.

For example, for x=1221x = 1221, we can reverse the second half from “21” to “12” and compare it with the first half “12”. Since they are equal, we know that xx is a palindrome.

Let’s see how to reverse the second half.

For the number 12211221, if we perform 1221mod101221 \bmod 10, we will get the last digit 11. To get the second last digit, we can first remove the last digit from 12211221 by dividing by 1010, 1221/10=1221221 / 10 = 122, then get the remainder of the previous result divided by 1010, 122mod10=2122 \bmod 10 = 2, to get the second last digit.

If we continue this process, we will get more reversed digits.

By continuously multiplying the last digit to the variable yy, we can get the number in reverse order.

In the code implementation, we can repeatedly “take out” the last digit of xx and “add” it to the end of yy, loop until yxy \ge x. If at this time x=yx = y, or x=y/10x = y / 10, then xx is a palindrome.

The time complexity is O(log10(n))O(\log_{10}(n)), where nn is xx. For each iteration, we will divide the input by 1010, so the time complexity is O(log10(n))O(\log_{10}(n)). The space complexity is O(1)O(1).

Python Code
1
2
3
4
5
6
7
8
9
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0 or (x and x % 10 == 0):
            return False
        y = 0
        while y < x:
            y = y * 10 + x % 10
            x //= 10
        return x in (y, y // 10)

Java Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0 || (x > 0 && x % 10 == 0)) {
            return false;
        }
        int y = 0;
        for (; y < x; x /= 10) {
            y = y * 10 + x % 10;
        }
        return x == y || x == y / 10;
    }
}

C++ Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0 || (x && x % 10 == 0)) {
            return false;
        }
        int y = 0;
        for (; y < x; x /= 10) {
            y = y * 10 + x % 10;
        }
        return x == y || x == y / 10;
    }
};

Go Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func isPalindrome(x int) bool {
	if x < 0 || (x > 0 && x%10 == 0) {
		return false
	}
	y := 0
	for ; y < x; x /= 10 {
		y = y*10 + x%10
	}
	return x == y || x == y/10
}

TypeScript Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function isPalindrome(x: number): boolean {
    if (x < 0 || (x > 0 && x % 10 === 0)) {
        return false;
    }
    let y = 0;
    for (; y < x; x = ~~(x / 10)) {
        y = y * 10 + (x % 10);
    }
    return x === y || x === ~~(y / 10);
}

Rust Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
impl Solution {
    pub fn is_palindrome(x: i32) -> bool {
        if x < 0 {
            return false;
        }
        let s = x.to_string();
        let bs = s.as_bytes();
        let n = bs.len();
        let mut l = 0;
        let mut r = n - 1;
        while l < r {
            if bs[l] != bs[r] {
                return false;
            }
            l += 1;
            r -= 1;
        }
        true
    }
}

Rust Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
impl Solution {
    pub fn is_palindrome(mut x: i32) -> bool {
        if x < 0 || (x % 10 == 0 && x != 0) {
            return false;
        }
        let mut y = 0;
        while x > y {
            y *= 10;
            y += x % 10;
            x /= 10;
        }
        x == y || x == y / 10
    }
}

JavaScript Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function (x) {
    if (x < 0 || (x > 0 && x % 10 === 0)) {
        return false;
    }
    let y = 0;
    for (; y < x; x = ~~(x / 10)) {
        y = y * 10 + (x % 10);
    }
    return x === y || x === ~~(y / 10);
};

PHP Code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution {
    /**
     * @param int $x
     * @return boolean
     */

    function isPalindrome($x) {
        $str = (string) $x;
        $str_reverse = strrev($str);
        return $str === $str_reverse;
    }
}