如何对超限长度的数字进行运算呢?leetcode模拟加法运算超简单

这是我参与更文挑战的第16天,活动详情查看: 更文挑战java

1、题目描述

66. 加一

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

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

你能够假设除了整数 0 以外,这个整数不会以零开头。markdown

image-20210615162613360

2、思路分析

  • 首先本题考查就是咱们经常使用的加法。此题和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赋予数组末尾而后直接返回数组oop

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

  • 上面咱们分析了进位只多是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;
}
复制代码

4、总结

  • 本题结合数学加法只须要仔细观察下加法产生的数据格式就能够写出来响应的代码了。
  • 他的简单是由于加的是1 , 若是不是1那么咱们须要稍微变换下加数与进位的关系
  • 若是是乘法那么进位不只仅是1 咱们也须要特殊考虑下!无论怎么样!此题算是咱们的一个开胃菜吧!!!

点赞呗!spa

相关文章
相关标签/搜索