每日算法(反转整数)-11.13

今天下班时间比较晚,回来后只学习了一道算法,反转整数,下面开始记录题以及自己的分析。

反转整数

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例1:

输入: 123
输出: 321

示例2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

给定一个 32 位有符号整数,将整数中的数字进行反转。
假设环境只能存储32位有符号整数,其数值范围是 [−2^31, 2^31−1]。根据这个假设,如果反转后的整数溢出,则返回 0。

根据题目判断类似于反转字符串,首先自己不假思索的用StringBuilder进行了实现,但是这样的话自己认为根本就不叫算法题,因此自己重新思考去实现,思路如下:
首先对一个数进行整除然后while循环,之后再进行赋值操作

int num = 0;
while(x!=0){
  num = num*10+x%10;
}

但是该方法并没有进行越界处理,当写出来之后查看解析发现处理的很巧妙:

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

思想是如果num大于Integer的最大边界/10则后面其无论加多少值都为越界,同样的道理因为题目规定最大值为2^31-1为2147483647,如果num==Integer.MAX_VALUE/10,则pop大于7之后则将越界;负数同样为该原理,查看解析后发现处理很是巧妙,自己需要学的地方还是很多,继续加油!

你可能感兴趣的:(每日算法(反转整数)-11.13)