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;
}
}