判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读起来都是一样的整数。
示例1:
输入: 121
输出: true
示例2:
输入: -121
输出: false
解释:从左向右读,为-121。从右向左读,为121-。因此它不是一个回文数。
示例3:
输入: 10
输出: false
解释:从右向左读,为01。因此它不是一个回文数。
方法一:普通解法
思路
将整数转换为字符串,然后将字符串分割成数组,循环数组的一半长度进行判断对应元素是否相等即可。
方法一:代码
///简单粗暴,看看就行
class Solution {
public boolean isPalindrome(int x) {
//当x小于0和尾数为0的时候直接可以false
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
//x+""是将整数转字符串,reverse()是字符串反转
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
//将x+""字符串和reversedStr字符串进行对比,相等返回true,不相等返回false
return (x + "").equals(reversedStr);
}
}
方法二:进阶解法-数学解法
通过取整和取余操作获取整数中对应的数字进行比较。
举个例子:1221这个数字。
-
通过计算1221/1000,得到首位1;
-
通过计算1221%10,得到末位1;
-
进行比较;
-
再将百位2和十位2取出继续比较。
方法二:代码
class Solution {
public boolean isPalindrome(int x) {
//当x小于0和尾数为0的时候直接可以false
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int div = 1;
//用while循环计算出最大的div,如1221可计算div=1000
while (x / div >= 10) {
div *= 10;
}
while (x > 0) {
//得到最左边的数字如left=1221/1000=1
int left = x / div;
//得到最右边的数字如right=1221%10=1
int right = x % 10;
//进行判断如果此时左右两边数不相等直接返回false
if (left != right) {
return false;
}
//然后获取剩下的数字,1221%1000=221,221/10=22。x现在为22
x = (x % div) / 10;
//x缩短两位数,所以div要除以100也缩短两位数。
div /= 100;
}
return true;
}
}
方法三:进阶解法-巧妙解法
这个方法就是取出后半段数字进行翻转,然后在和原来前半段数字进行对比。
注意
回文数可奇可偶,如果偶数长度直接取半。如果奇数取半的同时要/10取整。
做法如下:
-
每次进行取余操作%10,取出最低的数字:y=x%10;
-
将最低的数字加到取出数的末尾:revertNum=revertNum*10+y;
-
每取一个最低数字,x都要自除以10;
-
判断x是不是小于revertNum,当它小于的时候,说明数字已经对半或者过半了;
-
最后,判断奇偶情况:如果是偶数的话,revertNum和x相等;如果是奇数的话,最中间的数字就在revertNum的最低位上,将它除以10以后应该和x相等。
方法三:代码
class Solution {
public boolean isPalindrome(int x) {
//当x小于0和尾数为0的时候直接可以false
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
//1.判断x是否大于revertedNumber,假设x为12321
while (x > revertedNumber) {
//2.将x最后一位取出,并反转反转放入revertedNumber中,revertedNumber=0*10+12321%10=0+1=1
//4.revertedNumber=1*10+1232%10=10+2=12
//5.revertedNumber=12*10+123%10=120+3=123
revertedNumber = revertedNumber * 10 + x % 10;
//3.将x缩短一位x现在为1232,继续循环判断x是否大于revertedNumber
//5.x=123,再次判断
//6.x=12,不满足x>revertedNumber循环结束。
x /= 10;
}
//因为x为奇数所以要去掉revertedNumber中的最后一位数在进行对比。
return x == revertedNumber || x == revertedNumber / 10;
}
}
作者:MisterBooo 链接:https://leetcode-cn.com/problems/palindrome-number/solution/dong-hua-hui-wen-shu-de-san-chong-jie-fa-fa-jie-ch/ 来源:力扣(LeetCode)