title: 算法小练——整数反转
categories:

  • Algorithms
    tags:
  • esay
    abbrlink: 1153862305
    date: 2019-11-04 14:18:52

描述

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

示例

示例1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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

### 代码

class Solution {
        public int reverse(int x) {
        int a=0,b=0;
        while (x!=0){
            b =x%10;
            x/=10;
            
            //越界的情况,比最大值大 a>2^31 或者a=2^31 但是首字母>7
            if(a>Integer.MAX_VALUE/10 ||a==Integer.MAX_VALUE/10&&b>Integer.MAX_VALUE%10){
                return 0;
            }
            //越界情况,比最小值小
            if(a<Integer.MIN_VALUE/10 ||a==Integer.MIN_VALUE/10&&b<Integer.MIN_VALUE%10){
                return 0;
            }
            a =a*10+b;
        }
        return a;
    }
}

笔记

难点,处理越界。

如何会越界呢 a10+b>Integer.MAX_VALUE时,故可知 a一定 >Integer.MAX_VALUE /10 越界。

同样的, a*10+b<Integer.MIN_VALUE也越界,故可知a一定<Integer.MIN_VALUE/10.

再具体化区间,假如 a=Integer.MAX_VALUE/10呢 则 代替到上式

Integer.MAX_VALUE /10 *10+b >Integer.MAX_VALUE

Integer.MAX_VALUE/10 *10 +Integer.MAX_VALUE%10 =Integer>MAX_VALUE

负数的同理