LC 7. 整数反转

1. 问题描述


给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1
输入: 123
输出: 321
示例 2
输入: -123
输出: -321
示例 3
输入: 120
输出: 21

注意: 假设当前环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]
请根据这个假设,如果反转后整数溢出那么就返回 0。

Related Topics 数学

2. 题解


方法一、数学

记 rev 为翻转后的数字,为完成翻转,可以重复「弹出」x 的末尾数字,将其「推入」rev 的末尾,直至 x 为 0。

要在没有辅助栈或数组的帮助下「弹出」和「推入」数字,可以使用如下数学方法:

// 弹出 x 的末尾数字 digit
digit = x % 10
x /= 10
// 将数字 digit 推入 rev 末尾
rev = rev * 10 + digit

题目需要判断反转后的数字是否超过 32 位有符号整数的范围 [-2^{31},2^{31}-1],例如 x=2123456789 反转后的 rev=9876543212>2^31−1=2147483647,超过了 32 位有符号整数的范围。

因此需要在「推入」数字之前,判断是否满足 −2^31≤rev⋅10+digit≤2^31−1。若该不等式不成立则返回 0。

但是题目要求不允许使用 64 位整数,即运算过程中的数字必须在 32 位有符号整数的范围内,因此不能直接按照上述式子计算,需要另寻他路。

class Solution {
public int reverse(int x) {
int rev = 0, digit = 0;
while(x!=0){
if(rev < Integer.MIN_VALUE/10 || rev > Integer.MAX_VALUE/10){
return 0;
}
digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
}

复杂度分析

  • 时间复杂度:O(log∣x∣)。翻转的次数即 x 十进制的位数。

  • 空间复杂度:O(1)

posted @   guo-nix  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示