整数反转LeetCode7

整数反转

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

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21

注意:

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

题解(1个错解没考虑整数越界的情况)

           1.x > 0 flag = 1; x < 0 flag = -1;

           2.对x取绝对值

           3.将x递归对10取余将其从低位到高位的数存到Integer列表中

           4.逆向访问列表

public int reverse(int x) {
        ArrayList<Integer> list = new ArrayList<>();
        int sum = 0, flag = 1;
        if (x < 0){
            flag = -1;
        }
        x = Math.abs(x);
        while (x >= 10){
            int b = x % 10;
            list.add(b);
            x = x /10;
        }
        list.add(x);
        int j= 1;
        for (int i = list.size() - 1; i >= 0; i--){
            sum += j * list.get(i);
            j *= 10;

        }
        return sum * flag;
    }

正解(应该考虑上整数是否越界)


temp = x % 10;
x /= 10;
sum = sum * 10 + temp;

1.如果  sum ⋅ 10 + temp 导致溢出,那么一定有 sum ≥ Integer.MAX_VALUE / 10
2.如果  sum > Integer.MAX_VALUE / 10,那么 sum ⋅ 10+temp 一定会溢出。
3.如果  sum == Integer.MAX_VALUE / 10,那么只要temp > 7,sum ⋅ 10+temp 就会溢出。

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

 

 

猜你喜欢

转载自blog.csdn.net/weixin_43222122/article/details/106882580