Fork me on GitHub

ReverseNum

问题

给定一个 32 位有符号整数,将整数中的数字进行反转。

1
2
3
4
5
6
7
8
9
10
11
12
示例 1:

输入: 123
输出: 321
示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

解决

Java解决方案
安照正常的思考,我们的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
  	public static int reverse(int x) {
int temp = 0;
while (x!= 0) {

temp = temp *10 +x%10;
x /= 10;
}

if (temp <Integer.MIN_VALUE||temp>Integer.MAX_VALUE) {
return 0;
}
return temp;
}

当输入1245678993
输出了-296201875
细心的人就会发现,此时栈溢出了;

原因是多乘了一次10,解决办法就是,先判断是否已经栈溢出,再进行乘以10

1
2
3
4
5
6
7
8
9
10
11
  	public static int reverse(int x) {
int temp = 0;
while (x!= 0) {
if (temp <Integer.MIN_VALUE/10||temp>Integer.MAX_VALUE/10) {
return 0;
}
temp = temp *10 +x%10;
x /= 10;
}
return temp;
}

C语言解决方案
和java一样,先判断是否越界,再进行反转操作,这里我们需要引入头文件”limits.h”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int reverse(int x) 
{
int temp = 0;
while (x != 0)
{
//正数是否越界
if (temp > 0 && ((temp == INT_MAX / 10 && x % 10 > INT_MAX % 10) || temp > INT_MAX / 10))
return 0;

//负数是否越界
if (temp < 0 && ((temp == INT_MIN / 10 && x % 10 < (unsigned)INT_MIN % 10) || temp < INT_MIN / 10))
return 0;
temp = temp * 10 + x % 10;
x /= 10;
}
return temp;
}

本文标题:ReverseNum

文章作者:LiuXiaoKun

发布时间:2018年09月13日 - 23:09

最后更新:2019年02月12日 - 23:02

原始链接:https://LiuZiQiao.github.io/2018/09/13/反转整数/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%