logo头像

学如逆水行舟,不进则退!!!

文章目录

java基础类型表示数字范围有限,如何对超限长度的数字进行运算呢?leetcode模拟加法运算超简单

一、题目描述

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

image-20210615162613360

二、思路分析

  • 首先本题考查就是我们常用的加法。此题和2. 两数相加考查点基本相同!只不过那题稍微难的是链表的加入。本题只是数组且纯粹是加1操作!
  • 解题思路也很简单!我们只需要从数组末尾进行加1操作。后续判断是否有进位就可以了!

基础知识

  • 在计算机汇总永远都是二进制的天下。在介绍下面思路之前我们需要了解java中基础类型中的int、long等类型的取值范围
  • 首先一个bit就是二进制中一位。一个字节包含8位。

image-20210615194256231

  • java中8中基本类型。byte、short、int、long、double、float、boolean、char

image-20210615194356672

转成数字加1

image-20210615184836711

  • 将数组转成数字然后进行加1,最后在转换成数组。最后的数组可能会比之前多一位,这里我用红色进行特别标注了。在注入99这种类型的数字会发生增位的情况!
public int[] plusOne(int[] digits) {
    int total = 0;
    for (int i = 0; i <digits.length ; i++) {
        total = total * 10 + digits[i];
    }
    total += 1;
    for (int i = digits.length - 1; i >= 0; i--) {
        digits[i]=total%10;
        total = total / 10;
    }
    if (total != 0) {
        digits = new int[digits.length + 1];
        digits[0] = 1;
    }
    return digits;
}
  • 按照上面的思路我们可以轻松实现,最终测试也是没有问题的。咋看是没有问题但是我们仔细分析下还是可以看出其中的猫腻的或者说上面的代码在一定程度是没有问题的。
  • 题中指出在数组的长度最大是100 。 而我们使用int类型接收的数字,int类型是4字节也就是32位数字最大值是2147483647 即2^31。那么就会出现数组转成数组超出范围的情况。那么换成long可以吗?同样的分析long类型64位也无法满足100的长度。所以我们这里的思路在本题中是无法通过检验的。
  • 只能说我们是一种思路但是最终是无法满足题目要求的。

入乡随俗

  • 平时我们做加法需要借助一个进位。在程序中也就是我们需要一个额外的变量来存储进位。

image-20210616133029990

  • 我们仔细分析下两个一位数相加最大值也就是18,也就是说进位只可能是0或者1 。 而本题中恰巧就是添加1我们可以将理解成下一位的进位。
  • 我们只需要从数组末尾开始循环这个操作,而且因为是加1所以只要产生了进位那么当前值应该是0.也就是产生的结果是10

image-20210616133337100

  • 只会产生上面两种情况,其中c=a+b

image-20210616133714330

  • 第一步我们开始从末尾也就是4开始进行加1操作!得到的结果是5.因为5!=10。所以没有产生进位,所以在4之前的数据都不会发生变化。所以我们直接将5赋予数组末尾然后直接返回数组

  • 如果是9999,我们在最后一位进行加1,结果是10这个时候产生进位我们就需要到第三位进行加1,同样会产生进位那么我们就需要一直重复下去。最终数组会被更新为0000.

  • 上面我们分析了进位只可能是1 , 所以在所有位都发生了进位后原数组就会变成0 , 我们只需要在数组头部添加一个1元素即可

image-20210616134119690

public int[] plusOne(int[] digits) {
    for (int i = digits.length - 1; i >= 0; i--) {
        digits[i]++;
        digits[i] = digits[i] % 10;
        //对10取余之后如果是0说明发生进位,否则没有进位直接结束
        if (digits[i] != 0) return digits;
    }
    //说明当前数组全部发生进位类似999数字!此时需要扩展数组并且第一位为进位1
    digits = new int[digits.length + 1];
    digits[0] = 1;
    return digits;
}

四、总结

  • 本题结合数学加法只需要仔细观察下加法产生的数据格式就可以写出来响应的代码了。
  • 他的简单是因为加的是1 , 如果不是1那么我们需要稍微变换下加数与进位的关系
  • 如果是乘法那么进位不仅仅是1 我们也需要特殊考虑下!不管怎么样!此题算是我们的一个开胃菜吧!!!

点赞呗!

上一篇
坚持原创技术分享,您的支持将鼓励我继续创作!

评论系统未开启,无法评论!