LeetCode 7中等位运算
整数反转 图解题解
这道题到底在问什么
反转一个 32 位有符号整数,溢出则返回 0。
- 示例
- x=123 → 321;x=-120 → -21
最优解:一步一步想明白
- 3转字符串容易绕过溢出判断。
- 4每轮取出 x 的末位 digit,把 ans 变成 ans*10+digit;更新前先检查是否越界。
- 5整数反转:反复弹出 x 的最低位,接到 ans 的末尾。从最右的 3 开始。
- 6弹出 3:ans = 0×10 + 3 = 3,x 砍掉末位变 12。
- 7弹出 2:ans = 3×10 + 2 = 32,x → 1。
- 8弹出 1:ans = 32×10 + 1 = 321,x 变 0,停。
- 9关键帧:本题真正的坑是溢出。反转后若超出 32 位范围 [−2³¹, 2³¹−1](如 1534236469→反转溢出)就返回 0。C++/Java 用 long 暂存再判。末尾 0(如 −120→−21) 弹出后不会留前导 0。
- 12一句话记住:每轮取出 x 的末位 digit,把 ans 变成 ans*10+digit;更新前先检查是否越界。
- 21这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=bit 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
⚠️ 容易写错的地方
✗ 错:转成字符串再反转
✓ 对:用数学法 %10 / //10 逐位处理
转字符串绕过了溢出判断,面试通常要求纯数学法。
✗ 错:反转完才判溢出
✓ 对:用 long 暂存、或 ×10 前预判
ans 是 int 时 ×10 当场就溢出,事后判已经晚了。
✗ 错:以为负号要专门特判
✓ 对:按语言处理:C++/Java 靠负余数、Python 取 abs 再带回符号
C++/Java 的 %10 对负数给负余数、符号自动随 ans;Python 的 % 给非负余数,所以示例先 abs 再带回 sign。
完整代码(Python / C++ / Java)
Python
class Solution:
def reverse(self, x):
sign = -1 if x < 0 else 1
x = abs(x)
ans = 0
while x:
x, d = divmod(x, 10)
ans = ans * 10 + d
ans *= sign
return ans if -2**31 <= ans <= 2**31 - 1 else 0C++
class Solution {
public:
int reverse(int x) {
long ans = 0;
while (x != 0) {
int d = x % 10;
ans = ans * 10 + d;
x /= 10;
if (ans < INT_MIN || ans > INT_MAX) return 0;
}
return (int)ans;
}
};Java
class Solution {
public int reverse(int x) {
long ans = 0;
while (x != 0) {
int d = x % 10;
ans = ans * 10 + d;
x /= 10;
if (ans < Integer.MIN_VALUE || ans > Integer.MAX_VALUE) return 0;
}
return (int) ans;
}
}套路模板 · 数学反转 + 溢出判
# 整数反转骨架
ans = 0
while x != 0:
d = x % 10 # 取末位(负数得负余数)
x //= 10
ans = ans * 10 + d # 接到末尾
# 检查 32 位范围,超界返回 0
return ans if -2**31 <= ans <= 2**31-1 else 0复杂度
时间复杂度
O(log|x|)
循环次数 = x 的位数 (≤ 10)
空间复杂度
O(1)
只用 ans 一个累加变量
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 整数反转 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
核心思路是什么?+
反复 d=x%10 取末位、ans=ans×10+d 接到末尾、x//=10 砍掉,直到 x=0;最后检查 ans 是否超 32 位范围。
这道题为什么用「位运算」,换最直接的暴力解会差在哪?+
位运算抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。