leetcode每天一题:【加一】(简单)

160 阅读2分钟

这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

提供一个由 正整数(大于等于0,小于等于9) 组成的数组(数组长度大于等于0,小于等于100),然后需要你给这个数组合成的整数加一,然后再返回加一后的数组。

举个例子:

数组: [1, 2, 3]
返回: [1, 2, 4]  (数组组成的整数是123,加一后变成124,把整数拆开返回数组)

数组: [3, 9, 2]
返回: [3, 9, 3]  

数组: [3, 9]
返回: [4, 0]  

数组: [9]
返回: [1, 0]  

思路分析

第一种方法

因为数组的长度有可能是很大的(小于等于100),超过了js的最大安全数,所以如果你想遍历数组把所有元素转成数字,然后再把数字加一后转回数组,这样是行不通的,数字精度会丢失。

所以最好是通过遍历数组然后通过判断后直接在数组中把元素加一,再返回该数组。(因为单个元素的最大是9

然后这里需要注意数字9加一后是要往前进一位的。

所以我这里是使用while循环对数组遍历,从后面往前面遍历,如果当前遍历的元素是9,则把当前的元素置为0,然后继续遍历

如果下一位还是9,则把它继续置为0。直到有一位不是9的,把它加一,然后退出循环。

如果遍历到第一位的元素还是9的时候,则需要使用unshift方法把1插入。(因为9加1要进位)

然后退出循环。返回数组即可。

代码如下:

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function (digits) {
  let i = digits.length - 1
  while (i >= 0) {
    if (digits[i] === 9) {
      digits[i] = 0
      if (i === 0) {
        digits.unshift(1)
        break
      }
    } else {
      digits[i] += 1
      break
    }
    i--
  }
  return digits
};

第二种方法

第二种方法也是类似的做法,从后往前遍历,找到第一个不等于9的元素,则把当前元素加一,然后把处于该元素之后的元素都置为0(因为这些元素都是9)。

然后返回数组即可。

如果遍历结束后找不到有元素不等于9,则证明所有元素都等于9,需要新建个相同长度的数组,然后往里填充0。

最后把1插入到开头,返回该数组即可。

代码如下:

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function (digits) {
  const len = digits.length
  let i = len - 1

  while (i >= 0) {
    if (digits[i] !== 9) {
      ++digits[i]
      let j = i + 1
      while (j < len) {
        digits[j] = 0
        j++
      }
      return digits
    }
    i--
  }
  const arr = new Array(len).fill(0)
  arr.unshift(1)
  return arr
};