算法学习:leetcode7 整数反转

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

示例:

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

java版

解法一思路:

每次%10,从末尾取出数据,放到int数组中,这样就将整数倒过来了,然后依次乘以10,就组装成了最终结果,需要注意溢出问题,所以结果变量是用Long类型存储的,最后判断没有溢出转为int类型。

public int reverse(int x) {
        //int类型的是4个字节,32位的
        int[] result = new int[32];
        int m = x%10;
        int r = x/10;
        int i = 0;
        result[i] = m;
        while(r !=0) {
            i++;
            m = r%10;
            result[i] = m;
            r = r/10;
        }
        int flag =0;
        Long resultNum = 0l;
        for(int j=0; j<=i; j++) {
            int i1 = result[j];
            if(i1 == 0 && flag == 0) {
                continue;
            } else {
                flag = 1;
            }
            resultNum = resultNum * 10 + i1;
        }

        long rr = resultNum;
        if(Integer.MAX_VALUE < rr || Integer.MIN_VALUE > rr) {
            return 0;
        }
        return (int)rr;
    }

上面的思路很通俗,但是效率不高,有更高效的方式:

public static int reverse2(int x) {
        int rev =0;
        while(x !=0) {
            int pop = x%10;
            x /=10;
            //这里判断是否存在溢出
            //rev > Integer.MAX_VALUE/10 之所以除以10,是因为如果用rev与Integer.MAX_VALUE来判断,rev很可能存在溢出,代码直接就报错了
            //rev==Integer.MAX_VALUE/10 && pop>7 这里判断如果rev距离溢出只差1位,并且当前的rev的值与Integer.MAX_VALUE/10值相等,这是就要判断余数了
            //因为Integer.MAX_VALUE=2147483647,末尾是7,所以做了pop>7的判断
            //因为Integer.MIN_VALUE=-2147483648,末尾是7,所以做了pop<-8的判断
            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;
    }

代码中有一个关键点就是判断是否溢出:

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 > Integer.MAX_VALUE/10 之所以除以10,是因为如果用rev与Integer.MAX_VALUE来判断,rev很可能存在溢出,代码直接就报错了。

rev==Integer.MAX_VALUE/10 && pop>7 这里判断如果rev距离溢出只差1位,并且当前的rev的值与Integer.MAX_VALUE/10值相等,这是就要判断余数了。

因为Integer.MAX_VALUE=2147483647,末尾是7,所以做了pop>7的判断。

因为Integer.MIN_VALUE=-2147483648,末尾是7,所以做了pop<-8的判断。