美文网首页
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