美文网首页
Leetcode 7 整数反转

Leetcode 7 整数反转

作者: hekirakuno | 来源:发表于2019-10-19 11:44 被阅读0次

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
    示例 1:
    输入: 123
    输出: 321
    示例 2:
    输入: -123
    输出: -321
    示例 3:
    输入: 120
    输出: 21
    注意:
    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

    思路:很蠢的思路,就是转成字符串之后遍历,但是一定要注意边界判断,为了不超,直接判断最大值/10和计算值的大小。

    class Solution {
           //定义最小值
        public static final int MIN_VALUE = 0x80000000;
        //定义最大值
        public static final int MAX_VALUE = 0x7fffffff;
        public int reverse(int x) {
             //先将x转化成字符串(x范围是int所以这一步数据不会有变动)
            String xs = Integer.toString(x);
            //然后判断首位是否为负(默认为正)
            boolean negative = false;
            //因为是整数,所以总是有值的,不可能出现为空或者单符号的情况。所以直接判断
            char header = xs.charAt(0);
            //如果首位为负
            if(header=='-'){
                negative = true;
                xs = xs.substring(1,xs.length());
            }
            //如果首位为正
            else if(header=='+') {
                xs.substring(1, xs.length());
            }
            //结果
            int result = 0;
            //进位
            int carry = 1;
            //123翻转,则就是321,从后向前读,但是对于转换成int,我们还需要拼装一下,拼装规则是原数如果是abc,那么新数就是a+10b+100c,所以直接从首位开始
            for(int i = 0;i<xs.length();i++){
                char zero = '0';
                //ascii码值转换int
                int num = xs.charAt(i)-zero;
                //这里的边界值判断我死了,int计算超出就会自动变小,所以直接去计算边界来比较铁定要GG。所以边界值都除以10,缩小范围比较,而且一定要先除再乘以num,保证你一直在int类型范围内。不然那依旧GG
                if(negative){
                    if(-(carry/10*num+result/10)<-MIN_VALUE/10){
                        return 0;
                    }
                }else {
                    if((carry/10*num+result/10)>MAX_VALUE/10){
                        return 0;
                    }
                }
                result = num*carry+result;
                carry = carry*10;
            }
            return negative?-result:result;
        }
    }
    

    优化代码:

    class Solution {
        public int reverse(int x) {
            //学习官方题解
            //从后向前比的
            int ans = 0;
            while (x != 0) {
                int pop = x % 10;
                if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7)) 
                    return 0;
                if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8)) 
                    return 0;
                ans = ans * 10 + pop;
                x /= 10;
            }
            return ans;
        }
    }
    

    相关文章

      网友评论

          本文标题:Leetcode 7 整数反转

          本文链接:https://www.haomeiwen.com/subject/lwigmctx.html