leetcode 7-整数翻转

348 阅读1分钟

题目介绍

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。  

示例 1:

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

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

输入:x = 120 输出:21 示例 4:

输入:x = 0 输出:0  

提示

-231 <= x <= 231 - 1

解题

会导致溢出,需要考虑到异常情况

1.将数字转换成string,然后进行循环拼接和转换等操作.使用%10和/10一步步取出最后一位的数字

public static int reverse(int x) {
        // 转换成string
        String s = String.valueOf(x);
        String i = "";
        // 通过string的拼接实现数字拼接
        while (x != 0) {
            // 获取个位数
            i = i + String.valueOf(x % 10);
            // x去掉个位数
            x = x / 10;
        }
        String name = "";
        // 循环会将-也带入,使用 - 当做分隔符将数字分离成数组
        String[] split = i.split("-");
        for(String value : split) {
            name = name + value;
        }
        //当入参为0时,返回0 (上面的逻辑判断为"")
        if (name.length()==0) {
            name = "0";
        }
        //  分离成数组那一部将入参的正负抹掉了,现在手动判断加入
        if (s.contains("-")) {
            name = "-" + name;
        }
        // 可能会发生溢出问题,手动返回
        try {
            return Integer.valueOf(name);
        } catch (Exception e) {
            return 0;
        }
    }

image.png

2.入参转换成字符串,在通过StringBuild翻转成字符串转换成int

String s = String.valueOf(x);
        // 直接使用字符串翻转
        StringBuilder stringBuilder = new StringBuilder(s);
        // 字符串转换成stringBuild进行翻转然后再转换成字符串
        try{
            // 如果是负数,需要将负数去掉再翻转
            if (s.startsWith("-")) {
                return Integer.valueOf("-"+new StringBuilder(s.substring(1)).reverse().toString());
            }else {
                return Integer.valueOf(new StringBuilder(s).reverse().toString());
            }
        }catch (Exception e){
            return 0;
        }

image.png

3.方法2的改进

将判断正负提出try提高性能,并且改成小于,通过flag进行符号控制

String s = String.valueOf(x);
        // 直接使用字符串翻转
        String value = s;
        // 负数标志位,如果去掉负数,那么该值需要替代负数(翻转的数 乘 -1)
        int flag = 1;
        // 如果是负数,需要将负数去掉
        if (x < 0) {
            flag = -1;
            value = s.substring(1);
        }
        // 切换成StringBuild翻转再返回
        try{
             return Integer.valueOf(new StringBuilder(value).reverse().toString()) * flag;
        }catch (Exception e){
            return 0;
        }

image.png

4.直接用int转换,进行出参的判断

但是!!! 这个判断毫无意义,int 保存的时候已经强转了,因此不会触发溢出.

因此,需要在循环里 /10 溢出的时候就返回 0

				int reverse = 0;
        while (x != 0) {
            // 通过*10,可以每次向前一位,刚好填补
            reverse = reverse * 10 + x % 10;
            x = x /10;
        }
        // 由于翻转,因此可能会溢出  1999xxx 翻转成9xxxx1
        return  x  > -2147483648 && x < 2147483647 ? reverse : 0;

通过一个中间值记录上一个值,通过/10 比较,如果不相同,那么说明溢出

int reverse = 0;
        while (x != 0) {
            //记录上一个翻转值
            int temp = reverse;
            // 通过*10,可以每次向前一位,刚好填补
            reverse = reverse * 10 + x % 10;
            x = x / 10;
            // 和上一个值进行比较,如果/10之后 int不相等,那么说明溢出.
            if (reverse / 10 != temp) {
                return 0;
            }
        }
        // 由于翻转,因此可能会溢出  1999xxx 翻转成9xxxx1
        return  reverse;

image.png