[leetcode]7.Reverse Integer

题目

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。

猜你喜欢

转载自www.cnblogs.com/shinjia/p/9717804.html
今日推荐