leetcode:回文数

我家分成两‘党’。一党是我父亲,是执政党。反对党由我、母亲、弟弟组成,有时连雇工也包括在内。可是在反对党的‘统一战线’内部,存在着意见分歧。我母亲主张间接打击的政策。凡是明显的感情流露或者公开反抗执政党的企图,她都批评,说这不是中国人的做法。

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

解法一:反转一半数字

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;
}
}

这段代码是一个判断整数是否为回文数的Java函数。回文数就是从前往后读和从后往前读都一样的数,比如121、12321等。这个函数的思路是将输入的数的后半部分反转,然后和前半部分比较,如果相等,则这个数是回文数。
函数首先处理了一些特殊情况:如果x小于0,那么x肯定不是回文数,因为回文数不会以负号开头;如果x的最后一位是0,那么为了使x成为回文数,其第一位也应该是0,也就是说x应该是0。在这两种情况下,函数直接返回false。
然后函数使用一个while循环将x的后半部分反转。循环每次执行时,都会将revertedNumber乘以10,然后加上x的最后一位数字,然后将x除以10。这样,每次循环结束时,revertedNumber都会是x后半部分的反转,而x会是前半部分。
最后,函数比较x和revertedNumber是否相等,或者x是否等于revertedNumber除以10的结果(这是为了处理数字长度为奇数的情况)。如果相等,那么x就是回文数,函数返回true;否则,返回false。

if (x < 0 || (x % 10 == 0 && x != 0)) {
    return false;
}
int revertedNumber = 0;

1-1这段代码是回文数判断函数的开始部分,主要是进行了一些预处理和初始设置

这段代码的意思是:
1. `if (x < 0 || (x % 10 == 0 && x != 0))`: 如果输入的整数`x`小于0,或者`x`的个位数是0但`x`本身不是0(也就是说`x`是以0结尾的非零数),那么则判定`x`不是回文数,返回`false`。因为负数没有回文数的说法,而且以0结尾的非零数也不可能是回文数。
2. `int revertedNumber = 0;`: 这行代码是在初始化一个名为`revertedNumber`的变量,这个变量用于存储`x`反转后的结果。开始的时候,我们将其初始化为0。

 

revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;

1-2这两行代码实现的是将一个整数反转的操作。


详细解释如下:
1. `revertedNumber = revertedNumber * 10 + x % 10;`:这行代码实现了每次将`revertedNumber`向左移动一位(也就是乘以10),然后将`x`的个位数添加到`revertedNumber`的末尾。这里的`x % 10`表示取`x`的个位数。例如,如果`x`是123,`x % 10`的结果就是3。
2. `x /= 10;`:这行代码实现了将`x`向右移动一位(也就是除以10)。这会将`x`的个位数去掉。例如,如果`x`是123,`x /= 10`的结果就是12。
通过这两行代码的循环执行,就可以实现将一个整数反转的操作。例如,如果输入的`x`是123,那么反转后的`revertedNumber`就是321。

过程:renumber=0,x=12321;renumber=1,x=1232;renumber=12,x=123;renumber=123,x=12;
 

return x == revertedNumber || x == revertedNumber / 10;

1-3这行代码是在判断整数是否为回文数的最后一步(排除数字长度为奇数的情况)


这行代码的意思是:如果`x`等于`revertedNumber`,或者`x`等于`revertedNumber`除以10的结果,那么就返回`true`,否则返回`false`。
这样做的目的是为了处理数字长度为奇数的情况。当数字长度为奇数时,通过前面的操作,`revertedNumber`可能会比`x`多一个中间的数字。例如,当输入为12321时,在while循环的末尾,我们可以得到 x = 12,revertedNumber = 123。由于处于中位的数字对于判断回文来说没有影响(因为它总是与自己相等),所以我们可以简单地将其去除。也就是说,只要`x`等于`revertedNumber`除以10的结果,我们就可以认为原数字是回文数。

算法细节

首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。除了 0 以外,所有个位是 0 的数字不可能是回文,因为最高位不等于 0。所以我们可以对所有大于 0 且个位是 0 的数字返回 false。

现在,让我们来考虑如何反转后半部分的数字。

对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。

现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?

只要满足x == revertedNumber || x == revertedNumber / 10;偶数和奇数的情况都得到了解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值