LeetCode 66题 加一 -- JavaScript

题目描述:

给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 :

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321
输入: [1,9,8,9]
输出: [1,9,9,0]
解释: 输入数组表示数字 1989

方法分析: 

看到这个题,我的第一反应把输入的数组转换为数字,然后加一,再还原为数组,以下就是我之前的代码:

var plusOne = function(digits) {
  var dig2intplus1 = 1+ +digits.join("");
  var res2Arr = [...dig2intplus1.toString()]
  return res2Arr.map((item) => +item)
};

 抛开该代码来回的类型转换不说,其最大的问题就是js的精度问题。当数字超过 2^{53} 时,js的计算就会失真。

具体可查看知乎回答:https://www.zhihu.com/question/29010688

这条路走不通,只有换一条路走了。看来,我们就只有遍历数组了,倒序遍历数组,判断该位是否为9,如果不为9,将该位加1,然后结束迭代,返回结果即可;如果该位为9,将该位置0,并判断上一位是否为9,重复该操作即可。这里要注意,在结束迭代之后,如果数组首位为0,这时应该在数组开头加上1,比如输入[9,9,9]就应返回[1,0,0,0]。

代码如下。

代码实现:

var plusOne = function(digits) {
  //倒序遍历数组
  for (var i = digits.length - 1; i >= 0; i--) {
    //判断该位是否为9,如果为9,则置0,否则正常加1并返回
    if(digits[i] != 9 ){
      ++digits[i];
      return digits;
    }
    digits[i] = 0;
  }
  //当数组首位为0时,在首位插入1
  digits.unshift(1);
  return digits;
};

代码解析:

这段代码的逻辑在方法分析中已经比较清晰的阐述过了,此处就不再赘述了。

该算法的时间复杂度为:O(n) 

相关链接:https://leetcode-cn.com/problems/plus-one/description/

你可能感兴趣的:(LeetCode)