<filename>c++/0009-palindrome-number.cpp
// 9. Palindrome Number [Easy]

// Determine whether an integer is a palindrome.
// An integer is a palindrome when it reads the same backward as forward.

// Example 1:
// Input: 121
// Output: true

// Example 2:
// Input: -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: 10
// Output: false
// Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

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

class StraightforwardSolution
{
public:
    bool isPalindrome(int x)
    {
        if (x < 0)
            return false;
        if (x == 0)
            return true;
        int n = int(log10(x)), a = 0, b = n;
        while (a < b)
            if (digit(x, a++) != digit(x, b--))
                return false;
        return true;
    }

private:
    int digit(long long x, int k)
    {
        long long base = 1;
        while (k-- > 0)
            base *= 10;
        return x % (base * 10) / base;
    }
};

class Solution
{
public:
    bool isPalindrome(int x)
    {
        if (x < 0)
            return false;
        // o: original, r: reversed
        int o = x, r = 0;
        for ( ; x; x /= 10)
            r = r * 10 + x % 10;
        return r == o;
    }
};
