1. 问题背景与需求分析
整数翻转是算法练习中的经典问题,也是技术面试中的高频考点。题目要求将一个32位有符号整数进行数字位上的翻转,同时需要处理翻转后可能出现的溢出情况。这个问题看似简单,但涉及到位运算、边界条件处理等多个计算机科学基础知识。
在实际开发中,类似的操作常出现在序列号生成、数据加密等场景。比如某些系统需要将用户ID进行可逆变换后作为临时令牌使用,这时就需要确保变换后的数值仍在有效范围内。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
2.1 基础解法分析
最直观的解法是通过字符串操作:
- 将整数转为字符串
- 反转字符串
- 转换回整数
- 处理符号和前导零
但这种方法效率较低,且不符合题目要求的"不允许存储64位整数"的限制条件。
2.2 数学解法原理
更优的解法是通过数学运算逐步构建反转数:
- 通过取模运算获取最后一位数字
- 通过除法运算去掉已处理的最后一位
- 将当前结果乘以10后加上新获取的数字
- 重复上述步骤直到原数变为0
这种方法的时间复杂度为O(log10(n)),空间复杂度为O(1),完全符合题目要求。
3. 关键实现细节
3.1 溢出处理机制
32位有符号整数的范围是[-2^31, 2^31-1]。在构建反转数时,需要在每次迭代后检查:
- 如果当前结果 > INT_MAX/10,或者等于INT_MAX/10且下一位数字>7,则会发生正溢出
- 如果当前结果 < INT_MIN/10,或者等于INT_MIN/10且下一位数字<-8,则会发生负溢出
注意:这里的7和-8是因为INT_MAX的最后一位是7,INT_MIN的最后一位是8
3.2 边界条件处理
特殊测试用例需要考虑:
- 输入为0的情况
- 输入以0结尾的数字(如12300)
- 正好等于边界值的情况(如2147483647)
- 负数的情况
4. 完整代码实现
python复制def reverse(x: int) -> int:
INT_MAX = 2**31 - 1
INT_MIN = -2**31
rev = 0
sign = -1 if x < 0 else 1
x = abs(x)
while
