问题
给定一个 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 | public static int reverse(int x) { |
当输入1245678993
输出了-296201875
细心的人就会发现,此时栈溢出了;
原因是多乘了一次10,解决办法就是,先判断是否已经栈溢出,再进行乘以101
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
17int 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;
}