初级算法 - 数组末位加一

初级算法 - 数组末位加一

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

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

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

示例 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,返回的数字也是如此。

所以如果如果给定一个单元素为9的数组,返回的数据应该是[1, 0],而不是[10]

解法一

反转数组,暴力破解。

function plusOne(digits: number[]): number[] {
    let isAdd: number = 0; // 是否进位
    digits.reverse();
    for (let i: number = 0; i < digits.length; i++) {
        if (digits[i] !== 9) {
            if (isAdd === 1 || i === 0) {
                digits[i] = digits[i] + 1;
                break;
            }
        } else if (digits[i] === 9) {
            digits[i] = 0;
            if (digits[i + 1]) {
                isAdd = 1;
            } else {
                digits.push(1);
                break;
            }
        }
    };
    return digits.reverse();
};

解法二

没有反转数组,依然是暴力破解。

function plusOne(digits: number[]): number[] {
    for (let i: number = digits.length - 1; i >= 0; i--) {
      digits[i]++;
      if (digits[i] >= 10) {
          digits[i] = 0;
          if (!digits[i - 1]){
            digits.unshift(1);
            break;
          }
      } else if (digits[i] < 10) {
        break;
      } else if (digits[i - 1]) {
          digits[i] = digits[i] + 1;
          break;
      }
    } 
    return digits;
};

解法三

对数组进行循环,当前元素自加一,如果10取模等于0,则表示当前元素为9,继续循环;如果取模后还有数字,则表示当前数字依然添加到尽头,无法再进一位,则退出循环。

function plusOne(digits: number[]): number[] {
    for (let i: number = digits.length - 1; i >= 0; i--) {
        digits[i]++;
        digits[i] = digits[i] % 10;
        if (digits[i]) {
            return digits;
        }
    }
    digits.unshift(1);
    return digits;
};

三个解法,在TypeScript中,解法一最快,不知道是不是网速问题,如果换成Js中的话,个人倾向于解法三最优解(未确认)。

比如将数组转为整个数字加完后转为数组的,就不说了,太暴力;且数据过多,直接升天。

# 算法 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×