1. 整数翻转问题概述
今天想和大家分享一个我在LeetCode刷题过程中遇到的经典问题——整数翻转。这个问题看似简单,但实际编码时会遇到不少边界条件和细节处理上的坑。作为一道考察基础编程能力和边界思维的基础题,它在面试中出现频率相当高。
题目要求我们实现一个函数,输入一个32位有符号整数x,返回将这个整数数字部分翻转后的结果。如果翻转后的整数超过32位有符号整数范围[-2³¹, 2³¹-1],则返回0。例如:
- 输入123 → 输出321
- 输入-123 → 输出-321
- 输入120 → 输出21
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 基本算法设计
解决这个问题的核心思路是通过数学运算逐位提取和重组数字。具体来说,我们可以:
- 记录原始数字的符号(正/负)
- 将数字转换为绝对值处理
- 通过取模和除法运算依次获取最后一位数字
- 将这些数字按相反顺序组合成新数字
- 恢复原始符号并检查溢出
这种方法的优势在于:
- 完全基于数学运算,不依赖字符串转换
- 时间复杂度O(log₁₀n),与数字位数成正比
- 空间复杂度O(1),只需常数额外空间
2.2 边界条件考虑
在实际编码前,必须充分考虑各种边界情况:
- 数字末尾有0的情况(如120→21)
- 负数处理(符号位保留)
- 翻转后溢出(如2147483647→7463847412)
- 输入为0的情况
- 输入本身就是边界值(-2147483648)
3. 具体实现方案
3.1 Python实现代码
python复制def reverse(x: int) -> int:
INT_MIN, INT_MAX = -2**31, 2**31 - 1
rev = 0
sign = -1 if x < 0 else 1
x = abs(x)
while x != 0:
# 弹出最后一位数字
pop = x % 10
x = x // 10
# 检查是否溢出
if sign == 1 and (rev > INT_MAX // 10 or (rev == INT_MAX // 10 an
