这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
- 示例 1:
输入:x = 121 输出:true
- 示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
- 示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
- 示例 4:
输入:x = -101 输出:false
提示:
-231 <= x <= 231 - 1
思路:
把回文数边界值外的输入值先排除
当输入值为负数时,则必定不是回文数,因为当一个整数为负数时,首位为负号(-),但是末位(个位数)不可能为负号(-) 当输入值的末位数为零时,也可能不是回文数,自然数(自然数属于整数)中,最小的回文数是0,若输入值为非零整数且末位数(个位数)为0,则必定不是回文数
做法一
(简单实现版)把该题看做上一个题目LeetCode-整数反转的拓展, 那么就是把整数反转后直接判断是否与输入值一致就能够出结果了,由于这里没有要求不允许存储 64 位整数,为了避免整数反转的结果溢出32位数,我们直接用一个大箱子(long类型)来装反转的数
实现
public boolean isPalindrome(int x) {
long y = 0;
long i = x;
while (x>0){
y = y*10 + x%10;
x /= 10;
}
return i == y;
}
}
做法二
(性能优化版)利用回文数的规律
回文数,顾名思义,就是左右两边相等,我们实现的思路依旧是整数反转的思路,但是,既然是回文数,那么我们可以反转一半的时候进行比较,当然,会有两种情况 输入值中数字个数是偶数个的时候,反转一半时,两边相等就可以判定为回文数 输入值中数字个数是奇数个的时候,刚刚反转一半多一个数的时候,判断左边比右边(进行/10操作,去掉个位数)相等也能判定为回文数
实现
public boolean isPalindrome(int x) {
if (x < 0 || (x != 0 && x %10==0)){
return false;
}
int y = 0;
while (x > y){
y = y*10 + x%10;
x /= 10;
}
return x == y || x == y/10;
}
}