Palindrome && Reverse Integer问题

Palindrome Number问题

题目链接

解题思路:首先需要注意两点,①负数和小数都不是回文数 ②Integer有32位的范围限制,所以反转之后可能溢出. 对该整数循环除以10,取余数和商,余数则为从尾到头依次的digit number,并利用该digit number计算反转之后的结果,直到商为0结束循环;最终判断反转结构是否与原数相等。

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0)
            return false;
        int reverse = 0;
        int quotient = x;
        while (quotient != 0) {
            reverse = reverse*10 + quotient%10;
            quotient = quotient/10;
        }
        if (reverse == x)
            return true;
        else
            return false; 
    }
}

优化解法: 分别从整数的首尾开始比对,第一位和最后一位比较,第二位和倒数第二位比较,一直比较到中间位置,如果发现全部都相等则说明是回文数,此方法可以避免溢出,例如对于:121,第一次比较1和1,剩下2;再比较2和2,发现它是回文数.

Reverse Integer问题

题目链接

解题思路:这道题与上一题类似,也是个反转整数的题,在java中Integer占据4个bytes, 有32位的范围限制,对于正数,它的最高位是0,所以它最大能表示的数是01111….(后面共31个1),数化成十进制即是2147483647,Integer.MAX_VALUE = 2147483647[0x7fffffff]; 负数能表示的最小数的二进制数为1000..(后面共31个0),化为十进制数即为-int 类型的范围是 -2147483648,即为Integer.MIN_VALUE.当一个整数溢出时,变成一个与原数不相等的在int范围内的数,所以可以通过reverse/10 != tmp来判断是否溢出.

public class Solution {
    public int reverse(int x) {
        // Consider the case: reverse overflow int
        int reverse = 0;
        int quotient = x;
        while (quotient != 0) {
            int tmp = reverse;
            // if (reverse > Integer.MAX_VALUE || reverse < Integer.MIN_VALUE)
            //    return 0;
            reverse = reverse * 10 + quotient % 10;
            quotient = quotient / 10;
            // deal with overflow
            if (reverse/10 != tmp) {
                return 0;
            }

        }

        return reverse;
    }
}