【问题标题】:Given a non-empty array of digits representing a non-negative integer, increment one to the integer (javascript)给定一个表示非负整数的非空数字数组,将整数加一(javascript)
【发布时间】:2020-09-29 03:41:51
【问题描述】:

想知道是否有人可以解释此问题的代码解决方案。这对我来说毫无意义:

给定一个表示非负整数的非空数字数组,将整数加一。

存储数字时,最高有效位位于列表的开头,并且数组中的每个元素都包含一个数字。

您可以假设整数不包含任何前导零,除了数字 0 本身。

解决方法如下:

var plusOne = function(digits) {
    let carry = true
    for (let i = digits.length - 1; i >= 0; i -= 1) {
        if (digits[i] === 9 && carry) {
            digits[i] = 0;
            if (i === 0) {
                digits.unshift(1);
                break;
            }
        } else if (carry) {
            digits[i] += 1;
            carry = false;
        }
    }
    return digits;
};

我对这个解决方案有几个问题:

  1. 变量进位的目的是什么?
  2. 为什么digits[i]设置为0?
  3. 为什么有一个 if 语句检查 (i===0)?反过来,为什么后面加了一个 1?

任何指导将不胜感激,谢谢!!

【问题讨论】:

  • 它实现了用铅笔和纸将两个十进制数相加的基本方法。还记得两个数字对应部分的两位数字加起来超过 9 的情况吗?你做什么工作?你携带 10 到下一列数字。
  • 也许可以组成三对或四对随机的 4 位数字,然后将它们加在一起(在纸上),同时考虑你在做什么。
  • 这更简单,组成一些随机的 4 位数字并加 1。
  • @Pointy 我明白你在说什么。不过,我并没有真正得到 unshift(1) 部分。假设数字 439 - 9 变为 0,我们将 1 加到 3 变为 440。Unshift 插入数字 1 而不是添加到数字。我这里可能有问题,所以请叫我出来!
  • .unshift(1) 只是在结果数组的前面加上一个额外的 1。当你只是加一时,进位不能是 1 以外的任何值,因为从一列“溢出”到下一列的唯一方法是将 1 加到 9。

标签: javascript arrays iteration increment


【解决方案1】:

您有一个整数数组,其中数组中的每个元素都代表一个数字。假设你得到 456,那么在索引 0 处你有 4 个,在索引 1 处你有 5 个,在索引 2 处你有 6 个。

现在,问题要求你给给定的数字加 1。

这里的进位是数学进位,当您必须添加两个数字的总和大于 10 时使用。默认情况下,我们将进位设置为 true,因为无论如何您都要在数字上加 1。首先,您遍历(反向)给定的数字并查找等于 9 的数字(进位为真),然后将当前数字更改为零并将 1 放在前面。如果进位为真且数字不是 9,则只需在数字上加 1。

例子:

plusOne([4,9,7])
(3) [4, 9, 8]

这里给出了数字 497,你只需在最后一位数字上加 1。

plusOne([1,4,9])
(3) [1, 5, 0]

这里我们看到最后一个数字是 9,所以首先我们将其更改为零,然后我们将倒数第二个数字加 1。

plusOne([9,9,9])
(4) [1, 0, 0, 0]

这里我们看到所有的数字都是9,我们把所有的数字都改成0并在开头加1(这就是使用unshift 1的地方)

【讨论】:

  • 在这种受约束的情况下,两位数字的总和永远不会大于 10,因为值 1 中除最后一位以外的所有数字都为零。所以它只需要担心数字9。
  • var plusOne = function(arr) { for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] === 9){ arr[i] = 0; if (i===0){ arr.unshift(1); } } else if (arr[i] != 9) { arr[i]++ } return arr } } 这是我想出的解决方案。你能解释一下为什么这行不通,或者我怎样才能把它改成正确的吗?
  • @NineTails 感谢这些例子,现在 unshift 更有意义了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多