反转整数 reverse integer
题目
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [− 2^31, 2^31 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
代码模板
class Solution {
public int reverse(int x) {
}
}
分析
看到这个题目,首先我们能想到的就是这个数%10,就能得到最后一位,然后再把这个最后一位*10,到下次循环的时候再加上下一次的最后一位。当然要注意的就是,在反转的过程中,判断Integer.MAX_VALUE/10与Integer.MIN_VALUE,如果超过这个值,就需要做限制判断,不让它走到下一个循环。
解答
class Solution {
public int reverse(int x) {
int result = 0;
while(x!=0){
int temp = result * 10 + x%10;
x = x / 10;
if (result > Integer.MAX_VALUE/10||result < Integer.MIN_VALUE/10){
return 0;
}
result = temp;
}
return result;
}
}
补充内容-Integer.MAX_VALUE的坑
对于Integer.MAX_VALUE补充一个东西,下面看一段代码:
for(int i=0;i<=Integer.MAX_VALUE;i++){
...
}
这种for循环乍看是没有什么问题的,但是它是一个死循环!
为什么会是个死循环呢?
首先大家知道int类型的其数值范围是 [− 2^31, 2^31 − 1]。
当我们达到Integer.MAX_VALUE也就是2147483647,二进制则是:0111 1111 1111 1111 1111 1111 1111 1111
当我们加1的时候就会变成:1000 0000 0000 0000 0000 0000 0000 0000。然而第一位是正负号,也就是说会变成:-2147483648。这就是补码的概念
所以这里就会变成-2147483648<=Integer.MAX_VALUE是成立的,于是会继续循环下去,就会造成死循环。