问题描述:
Determine whether an integer is a palindrome. Do this without extra space.
原问题链接:https://leetcode.com/problems/palindrome-number/
问题分析
判断回文数字的问题其实思路也比较简单。就是每次从数字的最高位和最低位进行比较。如果一直比较到它们两个位置重叠了还是相同的,那么就返回true,否则就返回false。因为每次要返回最高位,所以我们需要有一个数字来计算最高位。比如说1123,那么要求最高位我们就需要用这个数字除以1000。在求得这个数字之后,每次原数字除以它就得到最高位,原数字对10取模操作就得到最低位。假设这个数字为cal。下一次数字就要去掉最高和最低两个位。这个时候就需要首先该数字对cal取模去掉最高位的数字,然后再除以10以去掉最低位的数字。
在求这个最高位对应的值时,我们需要对cal不断乘以10并将它和目标数字比较。这里容易导致的一个问题就是当目标数字比较大的时候,它容易导致溢出。所以在实现的时候应该声明为long类型,然后在后面的计算中再转换回来。
根据讨论,得到代码如下:
public class Solution { public boolean isPalindrome(int x) { if (x < 0) return false; long t = 1; while (t * 10 <= x) t *= 10; int cal = (int) t; while (x != 0) { if (x % 10 != x / cal) return false; x = (x % cal) / 10; cal /= 100; } return true; } }
总结
问题的核心在于避免计算的过程中数字溢出。这也是最让人头疼和最容易出错的地方。