题目描述:
Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.
You may assume the integer do not contain any leading zero, except the number 0 itself.
The digits are stored such that the most significant digit is at the head of the list.
原题目链接: 66. Plus One
大白话:
给定一个数组存储的大数,计算其加一之后的值
示例输入与输出:
// [0] ==> [1]
// [5, 0] ==> [5, 1]
// [1, 0, 9] ==> [1, 1, 0]
// [1, 9, 9] ==> [2, 0, 0]
// [3, 0, 7, 9] ==> [3, 0, 8, 0]
思路:
用for循环遍历每一位,从最低位开始判断即数组的最后一位
如果判断的当前位不是9,那么正常+1,退出循环;
如果判断的当前位是9,那么当前位归零,开始第二轮循环判断上一位;
如果上一位不是9,那么正常+1(此时是进位的意思) 退出循环;
如果上一位是9,那么归零,开始判断上上位;
……
总结下神马时候能退出循环: 要么当前位不是9 要么需要扩位,除此以外别无其他。
扩位:
999这种就是需要扩位的数,当我们从低位判断到高位,在999的百位9按照上述流程也变为0后,下一步要做的就是扩位变成4位数,且最高位为1.
那么转换为程序语言,我们只需要在再加个最高位是否为零的判断即可
AC代码:
var plusOne = function(digits) {
for (var i = digits.length - 1; i >= 0; i--) {
if (digits[i] == 9) {
digits[i] = 0;
if (!digits[0]) {//判断加在此处比加在外面效率高些
digits.unshift(1);
return digits;
}
}
else {
digits[i] += 1;
return digits;
}
}
};
AC 代码2:[同样的思路,递归实现]
var plusOne = function(digits) {
var len = digits.length;
endPlus(len-1);
return digits;
function endPlus (k){
if(digits[k]==9){
digits[k]=0;
if(k===0){
digits.unshift(1);
}else{
endPlus(k-1);
}
}else{
digits[k]++;
}
}
};
over