题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
难度:
- 难度:简单
- 支持语言:JavaScript、Java、Python
相关标签
相关企业
- 阿里
- 腾讯
- 微保
- 有赞
思路 1:
- 使用字符串在反转并不是最好的选择,因为还需要处理负号和
0
的情况,用数字运算方式反转比较适合。 - 每次找到当前数的最后一位,然后作为反转数字的第一位,例如
123
:
123 --> 0*10 + 3
12 --> 3*10 + 2
1 --> 32*10 + 1
- 再注意保存开始的正负状态和结果的限制
[−2^31, 2^31 − 1]
。
思路 2:
- 本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换加
try catch
的方式来解决,第二个思路就是通过数学计算来解决。 - 由于字符串转换的效率较低且使用较多库函数,所以解题方案不考虑该方法,而是通过数学计算来解决。
- 通过循环将数字
x
的每一位拆开,在计算新值时每一步都判断是否溢出。 - 溢出条件有两个,一个是大于整数最大值
MAX_VALUE
,另一个是小于整数最小值MIN_VALUE
,设当前计算结果为ans
,下一位为pop
。 - 从
ans * 10 + pop > MAX_VALUE
这个溢出条件来看- 当出现
ans > MAX_VALUE / 10
且还有pop需要添加
时,则一定溢出 - 当出现
ans == MAX_VALUE / 10
且pop > 7
时,则一定溢出,7
是2^31 - 1
的个位数
- 当出现
- 从
ans * 10 + pop < MIN_VALUE
这个溢出条件来看- 当出现
ans < MIN_VALUE / 10
且还有pop需要添加
时,则一定溢出 - 当出现
ans == MIN_VALUE / 10
且pop < -8
时,则一定溢出,8
是-2^31
的个位数
- 当出现
- 作者:guanpengchn
思路 3:
result * 10 + x % 10
取出末位x % 10
(负数结果还是负数,无需关心正负),拼接到result
中。x / 10
去除末位,| 0
强制转换为32位有符号整数。- 通过
| 0
取整,无论正负,只移除小数点部分(正数向下取整,负数向上取整)。 result | 0
超过32位的整数转换结果不等于自身,可用作溢出判断。- 运算过程:
x | result |
---|---|
123 | 0 |
12 | 3 |
1 | 32 |
0 | 321 |
代码
JavaScript 实现
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let symbol=x<0 ? -1 : 1
x=Math.abs(x)
let res=0
while(x>0){
let t=x%10
res=res*10+t
x=Math.floor(x/10)
}
res*=symbol
if(res<-Math.pow(2,31) || res>Math.pow(2,31)-1)return 0
return res
};
/**
* @作者:zoffer
* @链接:https://leetcode-cn.com/problems/reverse-integer/solution/wei-yun-suan-ji-jian-jie-fa-by-ijzqardmbd/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let result = 0;
while(x !== 0) {
result = result * 10 + x % 10;
x = (x / 10) | 0;
}
/* 来源:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */
return (result | 0) === result ? result : 0;
};
Java 实现
/**
* @作者:jianrry
* @链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-jianrry/
*/
class Solution {
public int reverse(int x) {
int res = 0;
while (x != 0) {
int t = x % 10;
int newRes = res * 10 + t;
//如果数字溢出,直接返回0
if ((newRes - t) / 10 != res)
return 0;
res = newRes;
x = x / 10;
}
return res;
/* 来源:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */
}
}
/**
* @作者:javaniuniu
* @链接:链接:https://leetcode-cn.com/problems/reverse-integer/solution/suan-shu-javapython-by-javaniuniu/
*/
public int reverse(int x) {
String a = Integer.toString(x);
int b = 1;
if(a.charAt(0) == '-') {
a = a.substring(1);
b = -1;
}
char[] chars = a.toCharArray();
char[] chars1 = new char[chars.length];
for (int i = chars.length - 1; i >= 0; i--) {
chars1[chars.length - 1 - i] = chars[i];
}
Long aLong = Long.valueOf(new String(chars1));
if(aLong > Integer.MAX_VALUE || aLong < Integer.MIN_VALUE) {
return 0;
}
return (int) (aLong * b);
}
Python 实现
# @作者:stray_camel
# @链接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/
def reverse_force(self, x: int) -> int:
if -10 < x < 10:
return x
str_x = str(x)
if str_x[0] != "-":
str_x = str_x[::-1]
x = int(str_x)
else:
str_x = str_x[:0:-1]
x = int(str_x)
x = -x
return x if -2147483648 < x < 2147483647 else 0
# @作者:xi-ri-dan-zeng
# @链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-xi-ri-dan-zeng/
class Solution:
def reverse(self, x: int) -> int:
#将整数的绝对值转换成字符串
s=str(abs(x))
#翻转字符串
s=s[::-1]
#如果输入整数是负数,增加负号
if x <0:
s ='-' + s
#转换为整数
result = int(s)
#判断是否溢出
if result>=-2**31 and result<=2**31-1:
return result
else:
return 0
其他
- 原题leetcode链接:https://leetcode-cn.com/problems/reverse-integer/
- 合作方:JavaScript中文网 – 全球极客挚爱的技术成长平台
- 说明:leetcode 题解 | 每日一题🔥 所有题目并非全部为本人解答,部分为在复习学习中整理提取其他解题作者的优秀笔记,便于大家学习共同进步,如有侵权,请联系删除。
- 更多题解可以访问我的 码农周刊 仓库:https://github.com/meibin08/free-programming-books, 一起学习更多前端前沿知识。
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com