7.整数反转

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

2.答题

思路1:

  • 用x取余,得到个位数,后用x取模,移除个位数,0位数*10+个位数
  • 用x取余,得到十位数,后用x取模,移除十位数,个位数*10+十位数
  • .
  • .
  • 直到x为0,完成
public class Solution {
    public int reverse(int x) {
        int res = 0;
        while(x != 0) {
            int mod = x % 10;
            res = res * 10 + mod;
            x /= 10;
        }
        return res;
    }
}
复制代码

边界条件:如何判断反转后的整数是否超过32位有符号数,当循环到达最后一层时,即x<10&x>-10的时候,

  • 若x为正数:

    • x的前n-1位>MaxInt的前n-1位,会超出边界;
    • x的前n-1位=MaxInt的前n-1位,x最后一位>MaxInt的最后一位,会超出边界
  • 若x为负数:

    • x的前n-1位<MinInt的前n-1位,会超出边界;
    • x的前n-1位=MinInt的前n-1位,x最后一位<MinInt的最后一位,会超出边界

增加条件后的代码:

class Solution {
    public int reverse(int x) {
        int res = 0;
        while(x != 0) {
            if (x < 10 && x > -10) {
                if (res > (Integer.MAX_VALUE / 10)) {
                    return 0;
                }
​
                if (res == (Integer.MAX_VALUE / 10) && x > (Integer.MAX_VALUE % 10)) {
                    return 0;
                }
​
                if (res < (Integer.MIN_VALUE / 10)) {
                    return 0;
                }
​
                if (res == (Integer.MIN_VALUE / 10) && x < (Integer.MIN_VALUE % 10)) {
                    return 0;
                }
            }
            int mod = x % 10;
            res = res * 10 + mod;
            x /= 10;
        }
        return res;
    }
}
复制代码

提交结果:

整数反转-提交结果.png

呃,边界值的判断有点多,总感觉不太优雅

思路2:

  • 使用String存储x
  • 倒序截取字符串,并存入新的字符串中
  • 使用int的包类Integer,将字符串转行为Integer,利用Integer转换异常,处理最终结果超出范围的情况

代码实现如下:

class Solution {
    public int reverse(int x) {
        //防止负数出现“545454-”的情况
        String xString = String.valueOf(Math.abs(x));
        String targetString = new StringBuilder(xString).reverse().toString();
        
        try {
            int res = Integer.valueOf(targetString);
            return x < 0 ? -res : res;
        } catch (NumberFormatException exception) {
            return 0;
        }
    }
}
复制代码

提交结果:

整数反转2-提交结果.png

看代码是简化多了,但是两种思路的执行结果差距并不大,始终是干不过大神们啊。
本题暂时想到目前的两种方法,如有错误,请大家指出,如有其它解法,可以留言分享一下,谢谢阅读。
目前解题没有按顺序来,先找简单的题开始解,毕竟挑软柿子捏嘛。。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享