题目:
数组加一 点击跳转原页面
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
//示例一
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
//示例二
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
//验证示例:
[1,2,3] > [1,2,4]
[9] > [1,0]
[9,9,9] > [1,0,0,0]
[6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3] >
[6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4]
解答:
错误方法: 看到这个题 第一反应都是 把数组变成数字 然后加一,接着把数字打散变回字符串
// 这个能解决大部分的问题, 但是digits.length 太大是 在转换成数字的时候会出现浮点数 导致结果不准
var plusOne = function(digits) {
var countNum = Number(digits.join().replace(/\,/g,'')) + 1;
var newArr = String(countNum).split('');
newArr.map(function(v,i){newArr[i] = parseInt(v)});
return newArr;
};
plusOne([1,2,3]) // [1,2,4]
plusOne([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]) // [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]
/*一直在检查编码哪算错了
才发现是数值太大 转成了浮点数
Number("6145390195186705543")
"6145390195186705543"*1
parseInt("6145390195186705543")
以上3都会转换成:6145390195186705000
*/
正确方法:数组逐个数字的计算,一直递归上去
var plusOne = function(digits) {
var locationNum = digits.length - 1; //初始化在最后一位
function count_alone(index){
// 处理数字少于9的 直接当前位置+1
if(digits[index] < 9){
digits[index] = digits[index]+1;
return digits;
}else{
//当前位置的值标记为0,位置-1继续递归
digits[index] = 0;
locationNum --;
if(index == 0){
digits.unshift(1);
}else{
count_alone(locationNum);
}
}
}
count_alone(locationNum);
return digits;
};
mark一下 仅供参考 欢迎更正补充 end