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

Some hints: Could negative integers be palindromes? (ie, -1)

If you are thinking of converting the integer to string, note the
restriction of using extra space.

You could also try reversing an integer. However, if you have solved
the problem "Reverse Integer", you know that the reversed integer
might overflow. How would you handle such case?

There is a more generic way of solving this problem.

难度: Easy

本题要求判定一个整数是否为回文数字, 比如 1, 121, 都是回文数字, 但是-1, 12, 不是回文数字.
所有负数都不是回文数字.

本题还有一个关键要求, 不能使用额外空间. 我理解这里的额外空间是指堆空间. 在程序中不能去额外的new 什么变量, 更不用说提升空间复杂度.

直接上AC的解法:

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        int digits = 0;
        int tmp = x;
        while (tmp != 0) {
            tmp = tmp / 10;
            digits++;
        }
        for (int i = 1; i <= digits / 2; i++) {
            if (getDigit(x, i) != getDigit(x, digits + 1 - i)) {
                return false;
            }
        }
        return true;
    }

    private int getDigit(int target, int pos) {
        for (int i = 0; i < pos - 1; i++) {
            target = target / 10;
        }
        return target % 10;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.isPalindrome(1));
        System.out.println(s.isPalindrome(12));
        System.out.println(s.isPalindrome(11));
        System.out.println(s.isPalindrome(121));
        System.out.println(s.isPalindrome(1212));
        System.out.println(s.isPalindrome(-1));
        System.out.println(s.isPalindrome(-11));
        System.out.println(s.isPalindrome(-121));
        System.out.println(s.isPalindrome(-2147447412));
    }
}

解法很直接, 从两头开始往中间判定数字是否相同, 不同直接返回false.
其中getDigit方法是获取这个数的第n位数字, 为了满足不使用额外空间的要求, 这么解实际上提升了时间复杂度.


EthanSun
45 声望3 粉丝