算法练习第18道-加一

152 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

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

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

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

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/pl…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:

输入:digits = [0]
输出:[1]

思路分析

  • 首先考虑情况 第一种是常规数据没有9 => [0, 1, 3, 4], 第二种是非常规数据 => [1,2,9] [9,9,9]

第一种 常规数据

  • 首先循环是从后向前循环
  • 判断是否存在9,如果不存在,就是直接最后一位+1 return

第二种 有9分两种情况,部分是9,还有全部是9

  • 有多位9,但不全是9的情况

  • 依次倒叙判断哪个下标值不会9, 拿到下标值后

  • 从该下标值得下一位开始,全部替换为0

  • 全部是9的情况,那就长度加1, 把所有值都替换为0,第一位进一

代码

let plusOne = function(digits) {
  /**
   * 首先考虑情况,第一种是常规数据没有9 => [0, 1, 3, 4],
   * 第二种是非常规数据 => [1,2,9] [9,9,9]
   * 
   * 第一种,首先循环是从后向前循环
   *   判断是否存在9,如果不存在,就是直接最后一位+1 return
   * 
   * 第二种 有9分两种情况,部分是9,还有全部是9
   *    有多位9,但不全是9的情况
   *    依次倒叙判断哪个下标值不会9, 拿到下标值后
   *    从该下标值得下一位开始,全部替换为0
   *     
   *  全部是9的情况,那就长度加1, 把所有值都替换为0,第一位进一
   * */ 
  const len = digits.length;
  for (let i = len - 1; i >= 0; --i) {
    if (digits[i] !== 9) {
        ++digits[i];
        for (let j = i + 1; j < len; ++j) {
          digits[j] = 0;
        }
        return digits;
    }
  }

  let newArr = new Array(len + 1).fill(0);
  newArr[0] = 1
  return newArr;

}

测试结果

image.png