美文网首页
leetcode算法—整数反转(除与取余实现整数反转)

leetcode算法—整数反转(除与取余实现整数反转)

作者: 小胖学编程 | 来源:发表于2021-07-08 20:43 被阅读0次

leetcode地址

image.png

1. 总结

一拿到该题的时候,首先想到的便是for循环遍历然后进行反转。因为题目中重点强调了边界范围,所以在实现的过程中使用for循环获取到2^31的值。

写的比较坎坷,总体来说写完后的bug主要是:

1. for循环获取2^31时

int bj = 1;
for (int i = 0; i < 32; i++) {
    bj = 2 * bj;
}

问题出在哪里?

  1. 2^0为1,但是当i=0时,bj=2;故循环要在int i=1开始;
  2. 当bj为int类型,且bj=2^31时,由于int的范围[-2^31,2^31-1],那么bj实际的值为-2^31

修改方案:使用Integer.MAX_VALUEInteger.MIN来获取边界值;

2. 使用for循环实现整数反转后,得到反转的值存在越界问题;

修改方案:使用long来存储值,强转为int后,判断和long类型的关系;

3. 反转后的正负号问题;

设置标识位

1.1 如何确定int边界

为了防止int类型越界导致转换异常,故使用long类型来进行全局处理。在返回结果时,需要将long强转为int类型。

  • 当long强转前和强转后的值不同时(证明丢失精度),那么表示越界,按照题目描述返回0;
  • 否则的话,返回强转后的值;

1.2 字符串反转思路

    /**
     * 解答成功:
     * 执行耗时:14 ms,击败了5.74% 的Java用户
     * 内存消耗:38.2 MB,击败了5.00% 的Java用户
     */
    public int reverse(int x) {
        //1. x进入后转换为long类型
        long xl = Integer.valueOf(x).longValue();
        int end = xl < 0 ? 1 : 0;
        String s = xl + "";
        char[] chars = s.toCharArray();
        String r = xl < 0 ? "-" : "";
        //反转
        for (int i = chars.length - 1; i >= end; i--) {
            r = r + chars[i];
        }
        //强转
        Long l = r == "" ? 0 : Long.valueOf(r);
        int i = l.intValue();
        if (l > i || l < i) {
            return 0;
        } else {
            return i;
        }
    }

1.3 leetcode牛人思路

整数反转可看做入栈和出栈的过程,全程使用取余操作,获取整数的最后一个数字(完成出栈)。将出栈的数字入栈则做乘10操作。

注意点:

  1. 反转后的值存在越界风险,使用long来进行操作;
  2. 负数的除操作得到的商为负数,取余操作得到的余数也是负数;
    /**
     * 整数转换通过除与取余的方式
     * <p>
     * 0 -> 0
     * 12  ->  1  2  |  0  1
     * 123  -> (123)12   3 |(12) 1  2  |(1) 0   1
     * 1234 -> (1234) 123  4 |(123)  12 3 |  (12)  1  2  | 0  1
     * <p>
     * <p>
     * -1 ->  0  -1
     * -12 -> (12) -1  -2| (-1)  0  -1
     */

最终代码:

    /**
     * 借助除与取余进行反转
     * <p>
     * 执行耗时:1 ms,击败了100.00% 的Java用户
     * 内存消耗:35.7 MB,击败了25.79% 的Java用户
     */
    public int reverse(int x) {
        if (x == 0) {
            return 0;
        }
        //转换
        Long r = 0L;
        while (x != 0) {
            r = 10 * r + x % 10;
            x = x / 10;
        }
        int i = r.intValue();
        return i > r || i < r ? 0 : i;
    }

2. 回文数

力扣题目:9. 回文数

虽然题目不同,但是思路相同,利用除与取余实现的整数反转,反转后的整数和原整数进行判断。

    public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        //整数反转思维
        int source = x;
        long l = 0;
        while (x != 0) {
            l = l * 10 + x % 10;
            x = x / 10;
        }
        return l == source;
    }

相关文章

  • leetcode算法—整数反转(除与取余实现整数反转)

    leetcode地址[https://leetcode-cn.com/problems/reverse-integ...

  • 题集一

    1、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转 注意如何反转的思想取余 与 取商 2、...

  • LeetCode 每日一题 [7] 整数反转

    LeetCode 整数反转 [简单] 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 来...

  • LeetCode 7、整数反转

    整数反转 LeetCode题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例...

  • leetcode 整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123输出: 321...

  • LeetCode:整数反转

    LeetCode第7号问题:整数反转 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行...

  • 【leetCode】整数反转

    题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123输出: ...

  • leetcode:整数反转

    题目 作者:gpe3DBjDS1链接:https://leetcode-cn.com/problems/rever...

  • leetcode 整数反转

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

  • 2019-07-19

    LeetCode第七题整数反转: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 注意:...

网友评论

      本文标题:leetcode算法—整数反转(除与取余实现整数反转)

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