判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例1:
输入:123
输出:true
示例2:
输入 -121
输出:false
解法一:整数转换成字符串
思路:先将整数转化为字符串,然后利用 reverse()方法,将字符反转,最后利用 equals()方法,来判断字符串是否相等
代码
public boolean isPalindrome(int x)
{
String reversedStr = (new StringBuilder(x+"").reverse().toString());
return (x+"").equals(reversedStr);
}
解法二:数学解法
思路:通过取整和取余获取整数中对应的数字进行比较
例如:1221 这个数字
- 通过计算 1221/1000,得首位1
- 通过计算 1221%10
- 进行比较
- 再将 22 取出来继续比较
代码
public boolean isPalindrome(int x)
{
//边界判断
if(x<0) return false;
int div = 1;
while(x/div >= 10) div *= 10;//为获取左边第一位数字做准备
while(x>0)
{
int left = x/div;
int right = x%10;
if(left != right) return false;
x = (x%div)/10;//去除左右两端的数字,完成更新
div /=100;//更新
}
return true;
}
解法三:巧妙解法–对半折
思路:直观上来看待回文数的话,就感觉像是将数字进行对折后看能否一一对应:取出后半段数字进行翻转
这里需要注意的一个点就是由于回文数的位数可奇可偶,使用当它长度为偶数是,它对折过来应该是相等的;当它长度是奇数时,那么它对折过来后,有一个的长度需要去掉一位数(除以10并取整)
具体做法如下:
- 每次进行取余操作(%10),取出最低位的数字:y=x%10
- 将最低的数字加到取出数的末尾:revertNum = revertNum*10+y
- 每取一个最低位数字,x都要自除以10
- 判断x是不是小于revertNum,当它小于的时候,说明数字已经对半或者过半了
- 最后,判断奇偶数情况:如果是偶数的话,revetNum 和 x 相等;如果是奇数的话,最中间的数字就在 revertNum 的最低位上,将它除以10以后应该和x相等
代码
public boolean isPalindrome(int x)
{
if(x<0||(x%10 == 0&& x!=0)) return false;
int revertNum = 0;
while(x>revertNum)
{
revertNum = revertNum*10 + x%10;
x/=10;
}
return x == revertNum || x==revertNum/10;
}
**ps:以上来着于 LeetCode用户 程序员吴师兄 回文数 **