题目
Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
思路
题目的思路应该是比较简单的,就是用%和/操作。但是一个32bit的int整数逆转之后得到的可能会超出int整数的范围,所以我们可以先用long来保存result,在最后进行一次判断,如果result超出了int的范围,我们就返回0,否则就将result类型转换为int,然后返回。
至于负数,对结果是没有影响的,具体可参考:Java中的负数取模
解法一
class Solution {
public int reverse(int x) {
long result = 0;
while(x != 0) {
result = result*10 + x%10;
x = x/10;
}
return (result > Integer.MAX_VALUE
|| result < Integer.MIN_VALUE)? 0 : (int)result;
}
}
解法二
还有另外一种方法就是不用long,直接在循环过程中判断是否超出int范围,当x还不为0时,result至少还会进行一次乘10的操作,如果在此操作前判断出result的绝对值已经大于 int最大值/10,那么逆转的结果必然超出int范围,直接返回0即可。
class Solution {
public int reverse(int x) {
int result = 0;
while(x != 0) {
if(Math.abs(result) > Integer.MAX_VALUE / 10)
return 0;
result = result * 10 + x % 10;
x /= 10;
}
return result;
}
}
还有一个问题,为什么不用check是否等于214748364呢 (214748364 即为 INT_MAX / 10),因为输入的x也是一个整型数,所以x的范围也应该在 -2147483648~2147483647 之间,那么x的第一位只能是1或者2,翻转之后res的最后一位只能是1或2,所以res只能是 2147483641 或 2147483642 都在int的范围内。但是它们对应的x为 1463847412 和 2463847412,后者超出了数值范围。所以当过程中res等于 214748364 时, 输入的x只能为 1463847412, 翻转后的结果为 2147483641,都在正确的范围内,所以不用check。