通过万岁!!!
- 题目:给你一个整数,例如123,然后输出321。就是将这个数进行了反转。但是给定的数是[-2^31, 2^31-1],而且我们不能使用64位的整数。
- 思路:
- 错误思路:首先说一个简单的思路,就是将int转成String,得到长度len,然后从len-1开始遍历,每次都乘10的i次方,然后累加。但是这样会出现问题,例如1534236469,反转以后int存不下。因此这种思路不行。
- 还有一种方式,就是我们每次都将计算结果*10,然后加上本次遍历的结果。换句话说,本次遍历的放在了个位上。然后这个数需要每次进行计算之前,都看一下有没有超过int的max就可以了。
- 技巧:
- 这里我们不进行字符串的转换,而是使用取余即可。
- 并且,如果我们发现是负数,可以将x*-1后调用这个函数,并将返回结果*-1后再返回。
伪代码
定义变量ans,也就是我们转换后的变量。
while循环x不等于0
判断ans是不是大于最大值/10或者小于最大值/10,这时候再*10以后,一定是越界了,所以直接返回0就可以了。
判断如果等于最大值的时候,x如果是大于7,也是不能表示的,因为最大值的个位数是7,当前判断的情况是2147483647到147483649的时候
判断如果等于最小值的时候,x如果是小于-8,也是不能表示的,因为最小值的各位是8,当前判断的情况是-2147483648到-2147483649的时候
然后就是正常情况了,然后加上当前的个位数。
x还需要除10
return ans;
java代码
class Solution {
public int reverse(int x) {
int ans = 0;
while (x != 0) {
if (ans > Integer.MAX_VALUE / 10 || ans < Integer.MIN_VALUE / 10) return 0;// 这时候还是能比较,但是下面要对ans在乘10了
// 但是需要注意最大值为2147483647,最小值为-2147483648,再加下面两句会更加好,当让不加也能通过
if (ans == Integer.MAX_VALUE / 10 && x > 7) return 0;
if (ans == Integer.MIN_VALUE / 10 && x < -8) return 0;
ans = ans * 10 + x % 10;
x /= 10;
}
return ans;
}
}
- 总结:这个题的主要难点在于边界情况。其余的用什么方法其实都无所谓。