给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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
中的话,个人倾向于解法三最优解(未确认)。
比如将数组转为整个数字加完后转为数组的,就不说了,太暴力;且数据过多,直接升天。
Q.E.D.