LeetCode 9简单数学
回文数 图解题解
这道题到底在问什么
给你一个整数 x,如果它是回文数就返回 true,否则返回 false。回文数是指:正序(从左到右)和倒序(从右到左)读起来完全相同的数。
- 输入
- x = 123456654321
- 输出
- true(正着倒着读都一样)
最优解:一步一步想明白
- 3记住这对指针:l 从左、r 从右,一对对往中间收。逐对相等 → 继续;有一对不等 → 立刻判否。下面把 12 位数走完。
- 4把 123456654321 拆成 12 位排开。左指针 l 站在最左边的下标 0,右指针 r 站在最右边的下标 11,准备一对对地比。
- 5这一对里,左指针 l 落在下标 0,它的值是 1(高亮的这位)。
- 6右指针 r 落在下标 11,它的值是 1。现在把这一对的两位 1 和 1 拿来比。
- 71 和 1 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
- 8这一对里,左指针 l 落在下标 1,它的值是 2(高亮的这位)。
- 9右指针 r 落在下标 10,它的值是 2。现在把这一对的两位 2 和 2 拿来比。
- 102 和 2 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
- 11这一对里,左指针 l 落在下标 2,它的值是 3(高亮的这位)。
- 12右指针 r 落在下标 9,它的值是 3。现在把这一对的两位 3 和 3 拿来比。
- 133 和 3 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
- 14这一对里,左指针 l 落在下标 3,它的值是 4(高亮的这位)。
- 15右指针 r 落在下标 8,它的值是 4。现在把这一对的两位 4 和 4 拿来比。
- 164 和 4 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
- 17这一对里,左指针 l 落在下标 4,它的值是 5(高亮的这位)。
- 18右指针 r 落在下标 7,它的值是 5。现在把这一对的两位 5 和 5 拿来比。
- 195 和 5 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
- 20这一对里,左指针 l 落在下标 5,它的值是 6(高亮的这位)。
- 21右指针 r 落在下标 6,它的值是 6。现在把这一对的两位 6 和 6 拿来比。
- 226 和 6 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
- 23所有对都比过、且对对相等,两个指针在中间会合。123456654321 正着倒着读完全一样,是回文数,返回 true。
⚠️ 容易写错的地方
✗ 错:忘了负数的处理
✓ 对:x < 0 直接返回 false
负数带负号,如 -121 倒读是 121-,永远不是回文
✗ 错:循环条件写成 l <= r
✓ 对:用 l < r 即可
l == r 时是正中间那一位,自己跟自己比一定相等,多比一次没必要
✗ 错:用反转整个数字再比,没考虑溢出
✓ 对:双指针逐位比,或反转一半
把很大的数整个反转可能超出 int 范围;双指针不会溢出
完整代码(Python / C++ / Java)
Python
def isPalindrome(x):
if x < 0: # 负数一定不是回文(有负号)
return False
s = str(x) # 拆成每一位
l, r = 0, len(s) - 1
while l < r: # 从两端向中间逐对比
if s[l] != s[r]:
return False
l += 1; r -= 1
return TrueC++
bool isPalindrome(int x){
if (x < 0) return false;
string s = to_string(x);
int l = 0, r = s.size() - 1;
while (l < r) {
if (s[l] != s[r]) return false;
l++; r--;
}
return true;
}Java
public boolean isPalindrome(int x) {
if (x < 0) return false;
String s = String.valueOf(x);
int l = 0, r = s.length() - 1;
while (l < r) {
if (s.charAt(l) != s.charAt(r)) return false;
l++; r--;
}
return true;
}复杂度
时间
O(n)
n 是数字的位数,两个指针合起来最多扫一遍所有位
空间
O(1)
只用 l、r 两个指针;按位取数还能不转字符串、做到真正 O(1)
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 回文数 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
为什么负数一定不是回文?+
负数前面有个负号,比如 -121,倒着读会变成 121-,和原来对不上,所以负数一律返回 false。
不转成字符串能做吗?+
能。可以反转数字的后一半,和前一半比较,做到 O(1) 额外空间且不溢出;双指针按位取数也行。本题为讲清思路用了字符串。
个位数(如 7)是回文吗?+
是。只有一位的数,正着倒着读都是它自己,循环一次都不进就直接返回 true。
想听吴师兄把这道题讲给你听?
文字版和动画都随便看。开通图解算法年卡,可以听吴师兄把 回文数 一步步讲透(全站已上线 905 份讲透,持续扩充), 卡住的地方还有 AI 私教小欧就着动画帮你拆到懂。
把这道题真正拿下
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。