判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
int rev = reverse(x);
return x == rev;
}
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE / 10)
return 0;
if (rev < Integer.MIN_VALUE / 10)
return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
当倒置后的数字超出 int 的范围时,我们返回的是 0 ,那么它一定不等于原数,此时一 定返回 false 了,这正不正确呢?
我们只需证明,如果倒置后超出 int 的范围,那么它一定不是回文数字就好了。 反证法,我们假设存在这么一个数,倒置后是超出 int 范围的,并且它是回文数字。 int 最大为 2147483647
让我们来讨论这个数可能是多少。
有没有可能是最高位大于 2 导致的溢出,比如最高位是 3 ,因为是回文串,所以最低位是 3 ,这就 将导致转置前最高位也会是 3 ,所以不可能是这种情况。
有没有可能是第 2 高位大于 1 导致的溢出,此时保持最高位不变,假如第 2 高位是 2,因为是回 文串,所以个位是 2,十位是 2 ,同样的会导致倒置前超出了 int 的最大值,所以也不可能是这种 情况。
同理,第 3 高位,第 4,第 5,直线左边的都是上述的情况,所以不可能是前边的位数过大。 为了保证这个数是溢出的,前边 5 位必须固定不变了,因为它是回文串,所以直线后的灰色数字就一 定是 4 ,而此时不管后边的数字取多少,都不可能是溢出的了。
时间复杂度:x 有多少位,就循环多少次,所以是 O(log(x))
空间复杂度:O(1)