题目要求:
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
进阶:你能不将整数转为字符串来解决这个问题吗?
示例 1:
输入:x = 121 输出:true
示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
解题思路:
判断回文数立马想到将数字转化为字符串,调用reverse方法调换顺序,之后再判断前后两数是否相等即可验证是否是回文数
代码实现:
public boolean is(int num){
//方法一 转换字符串
StringBuffer sb = new StringBuffer(String.valueOf(num));
if (num<0||num%10==0&&num!=0){ //当为负数或不为零且个位为0是不是回文数
return false;
}
StringBuffer reverse = sb.reverse(); //反转字符串
if (reverse.toString().equals(String.valueOf(num))){
return true; //相等返回true
}else{
return false; //不同返回false
}
}
进阶要求:不转换字符串解决问题
同样的思路可以将数字反转,比较两个数字是否相等,但是可能会出现数值溢出的情况。
应为回文数应为正序和倒序都一样因此我们可以比较前一半与后一半是否相等来判读是否是回文数。
现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?
由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。
代码实现:
public boolean is2(int num){
//方法二 比较前一半与后一半是否相同(奇数时中间位数倒序始终是自己不影响结果)
//首先排除肯定不是回文数的类型
if (num<0||num%10==0&&num!=0){
return false;
}
int reverse = 0; //反转的后一半
while (num>=reverse){ //当原数字小于或等于反转数字后说明数字位数到达一般,退出循环
reverse = reverse*10+num%10; //12321 1-->12 12--->123
num/=10; //原数字除10
}
//12321 --> 12 和 123
return num == reverse||num == reverse/10;
}