LeetCode 9. 回文数(易)

注意边界判定

题目

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

进阶:

你能不将整数转为字符串来解决这个问题吗?

示例

示例 1:

1
2
输入: 121
输出: true

示例 2:

1
2
输入: -121
输出: false

解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

1
2
输入: 10
输出: false

解释: 从右向左读, 为 01 。因此它不是一个回文数。

考察知识点

边界值判断

核心思想

排除负数、个位数等特殊情况,然后按照除数取余的方法进行处理得到翻转之后的结果,与输入整数对比即可知是否是回文数。如果是回文数,显然不会溢出

Python版本

  • 自己写的一个版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def isPalindrome(self, x: int) -> bool:
if 0 <= x < 10:
return True
if x < 0:
return False

back_up_x = x
new_int = 0
while x!=0:
new_int = new_int*10 + x % 10
x //= 10

# 第一个版本
if new_int == back_up_x:
return True
else:
return False
# 第二个版本
return True if new_int == back_up_x else False
# 第三个版本
return new_int == back_up_x
  • 一个更简洁的版本,判断到一半即可,如果后面一半和前面一半相等,自然是回文数字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def isPalindrome(self, x: int) -> bool:
# 特殊情况:
# 如上所述,当 x < 0 时,x 不是回文数。
# 同样地,如果数字的最后一位是 0,为了使该数字为回文,
# 则其第一位数字也应该是 0
# 只有 0 满足这一属性
if x<0 or (x%10==0 and x!=0):
return False

revertedNumber = 0
while x>revertedNumber:
revertedNumber = revertedNumber * 10 + x % 10
x //= 10
# 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
# 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
# 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x==revertedNumber or x==(revertedNumber//10) # 这里要用//做整除

时间复杂度:\(O(\log_{10}(n))\) 空间复杂度:\(O(1)\)

Java版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}
}

有效语法糖

1、当函数返回值是布尔值的时候,可以直接返回判断式。

1
2
3
4
5
6
7
8
9
10
11
# 第一个版本
if new_int==back_up_x:
return True
else:
return False

# 第二个版本
return True if new_int==back_up_x else False

# 第三个版本 best
return new_int==back_up_x