我真的太喜欢定点调试了,如果看不懂别人循环代码的小伙伴,一定要试试定点调试。
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
两种解法:
第一种,和整数反转是一样的,但是有两个问题需要注意,一个是条件的判断,还有一个是 因为结果需要和 原来的 X 比较,但是在循环里面, x 的值会发生变化,所以要记得新建一个变量来保存 x 的值,这样比较的结果才不会有错。
来贴一下我写在 力扣上的代码。
class Solution {
public boolean isPalindrome(int x) {
int newx = x;
if(x<0 || (x%10==0 && x!=0)){
return false;
}
int revertedNumber= 0;
while(x!=0){
revertedNumber = revertedNumber*10+x%10;
x/=10;
}
return newx==revertedNumber ;
}
}
测试是通过了的。
第二种解法是官方解法,考虑到 会有溢出的问题,所以 只用判断一半的回文数就可以了。
在循环中, x 是随着变换减少的,如果是奇数个就 拿 x 和 反转了一半的整数 /10 相比较,如果是偶数个就拿 x 和反转了一半的整数相比较。这样也不会占用新的空间来保存 原来的 x ,空间效率就提高了。
在循环之前都需要判断的先决条件:
负数不是回文数,
末尾是 0 的数也不是回文数,因为最高位不能是 0.
所以条件是 小于 0 的数和 x%10 取尾数为 0 且 x > 0 的数不是回文数。
循环的终止条件是 x < revertedNumber , 也就是说循环的条件是 x 要小于 revertedNumber, 当 x 还是大于 反转的数十,x 还没反转一半,所以要继续反转。
class Solution {
public boolean isPalindrome(int x) {
// 特殊情况:
// 如上所述,当 x < 0 时,x 不是回文数。
// 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// 则其第一位数字也应该是 0
// 只有 0 满足这一属性
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber / 10;
}
}
链接:官解回文数