数学LeeCode9.回文数
Posted chenry777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学LeeCode9.回文数相关的知识,希望对你有一定的参考价值。
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121
是回文,而 123
不是。
题解一、将整数转为字符串来处理
把 int 转成字符串,然后判断是否是回文串做就可以了,缺点是需要额外的空间存储字符串。
class Solution {
// 题解一:将整数转为字符串来处理
public boolean isPalindrome(int x) {
StringBuilder temp1 = new StringBuilder(3).append(x);
String temp2 = temp1.toString();
String rev = temp1.reverse().toString();
return temp2.equals(rev);
}
}
调用了StringBuilder的reverse()方法,时间复杂度为O(log(n)),空间复杂度为O(n)
题解二、调用整数翻转函数来实现
在第 7 道题我们写了倒置 int 的算法,这里当然可以用到了,只需要判断倒置前后相不相等就可以了。
显然可证回文数不可能造成int类型值溢出,故无需判断值溢出
class Solution {
// 题解二:调用整数翻转函数来实现
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
return x == reverse(x);
}
public int reverse(int x) {
long rev = 0;
while(x != 0) {
int y = x % 10;
x /= 10;
rev = rev * 10 + y;
}
}
}
时间复杂度为O(log(n)),空间复杂度为O(1)
题解三、将右半部分倒置然后和左半部比较就可以了
其实,我们只需要将右半部分倒置然后和左半部比较就可以了。比如 1221 ,把 21 转置和 12 比较就行了。
比较的原理见下图:
class Solution {
// 题解三:将右半部分倒置然后和左半部比较就可以了
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
// 总位数
int digit = (int) (Math.log(x) / Math.log(10) + 1);
int rev = 0;
int y = 0;
//倒置右半部分
for (int i = 0; i < digit / 2; i++) {
y = x % 10;
x /= 10;
rev = rev * 10 + y;
}
// 偶数情况:x直接与rev比较
if (digit % 2 == 0 && x == rev) {
return true;
}
// 奇数情况:x除以10去除1位后再与rev比较
if (digit % 2 != 0 && x / 10 == rev) {
return true;
}
return false;
}
}
时间复杂度为O(log(n)),但是法2,空间复杂度为O(1)
以上是关于数学LeeCode9.回文数的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):数学类:第9题:回文数:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。