咳咳咳昨天晚上停电传不上
09
判断是不是回⽂数,负数不是回⽂数
首先我们只需证明,如果倒置后超出 int 的范围,那么它⼀定不是回⽂数字就好了。
证明过程略,的确不存在这样的一个数字。
解法一:
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x = x / 10;
if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;
rev = rev * 10 + pop;
}
return rev ;
}
public boolean isPalidarome(int x){ //在前面讨论转置的情况下,多出一个利用reserve的判断
if (x < 0 ){
return false;
}
else{int rev = reverse(x); return x == rev;}
}
第一种解法看起来更像是让题目变成了“数字倒置”的变形,第一部分求倒置过程相同,第二部分多出一个rev和reserve(x)的判断来确定是否是回文数。
解法二:
我们只需要将右半部分倒置然后和左半部⽐较就可以了。⽐如 1221 ,把 21 转置和 12 ⽐较就⾏了
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
int digit = (int) (Math.log(x) / Math.log(10) + 1); //总位数
int revert = 0;
int pop = 0;
//倒置右半部分
for (int i = 0; i < digit / 2; i++) {
pop = x % 10;
revert = revert * 10 + pop;
x /= 10;
}
if (digit % 2 == 0 && x == revert) {
return true;
}
//奇数情况 x 除以 10 去除 1 位
if (digit % 2 != 0 && x / 10 == revert) {
return true;
}
return false; }
时间复杂度:循环 x 的总位数的⼀半次,所以时间复杂度依旧是 O(log(x))。
空间复杂度:O(1),常数个变量