整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

题目链接:https://leetcode-cn.com/problems/reverse-integer/

 

题解思路:

如果不考虑益处的话,这道题目的思路并不难。那么如何解决溢出哪?

我的思路是直接用long类型  

System.out.println(Long.BYTES);//8个字节

最后判断运算的结果是否溢出即刻。

        if (result>Integer.MAX_VALUE||result<Integer.MIN_VALUE){
            return 0;
        }

 

主要代码:

    public int reverse(int x) {
        long result = 0;

        long numAbs = x;
        while (numAbs!=0){
            int temp = (int)numAbs % 10;
            numAbs = numAbs/10;
            result = result + temp;
            result = result * 10;
        }
        result = result / 10;

        if (result>Integer.MAX_VALUE||result<Integer.MIN_VALUE){
            return 0;
        }
        return (int)result;
    }

 

这种方法比较笨,因为是采用了大瓶装小瓶的办法,所以避免了溢出。但是万一题目给定的数据超出了“大瓶”的容量呢?

官方题解的方法值得学习:

 

首先采用数学方法模拟进出栈的操作解决整数反转的问题。如下:

//pop operation:
pop = x % 10;
x /= 10;

//push operation:
temp = rev * 10 + pop;
rev = temp;

 

然后留意溢出时的情况。(假设rev为正整数)

 

当rev为负数时可以应用类似的逻辑。

 

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}

 

posted @ 2020-02-19 22:03  focusDing  阅读(187)  评论(0编辑  收藏  举报