题目:回文数
题目描述:
给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
样例展示:
情形一:
输入:x = 121 输出:true情形二:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。情形三:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
思路:
1)0为回文数,负数不可,10的整数倍不可
2)以121为例,回文数中间位是不变的,左右对称,这是否意味着进行比较时只需判断前半部分即可?
3)回文数长度为奇数或偶数对最后的return语句的表述会有影响吗?
针对问题2:我们将while循环的范围限制在revertNum<x,因为revertNum是在不断增加,x在不断减少,当revertNum>=x时,则说明此时的revertNum已取到改数一半的位置,回文数左右依据中间位对称,因此无需再往下。
针对问题3:
对于revertNum的获取(通过while循环实现):
从给定数字的最后一位开始获取,乘10是为了和第一次获得的数进行进位相加
revertNum = x % 10 + revertNum * 10;
x = x / 10;
长度为奇数:仍以121为例
初始值 | x=121 | r=0 | 是否满足循环条件(x>r) |
第一次循环 | x=12 | r=1 | 是 |
第二次循环 | x=1 | r=12 | 否 |
此时x=revertNum/10
长度为偶数:以22为例
初始值 | x=22 | r=0 | 是否满足循环条件(x>r) |
第一次循环 | x=2 | r=2 | 否 |
此时x==revertNum
代码参考:
class Solution {
public boolean isPalindrome(int x) {
int revertNum=0; //表示反转后的数字
if(x == 0){
return true;
}
if(x < 0 || x % 10 == 0){
return false;
}
while(revertNum < x){
//这里的*10可以理解为:方便和下一次得到的revertNum进行拼接
revertNum = x % 10 + revertNum * 10;
x = x / 10;
}
//长度是偶数的话直接返回,长度是奇数的话看reverNum/10 和x是否相等
return revertNum == x || revertNum / 10 == x;
}
}