066 - 加一(plus-one)
/*
* @Author: lvjingshuai
* @Date: 2019-07-25 06:21:12
* @Last Modified by: lvjingshuai
* @Last Modified time: 2019-08-21
*/
文章结构 |
---|
1、题目介绍 |
2、解题 |
2.1 解法 - 数学思维 |
3、每日一问 |
1、题目介绍
- 难度:简单 (系统学习算法与数据结构)
- 涉及知识:数组
- 题目编号:066
- 题目地址:https://leetcode-cn.com/problems/plus-one/
- 题目内容:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
2、解题
2.1 解法 - 数学思维
解题思路:
-
这道题一开始的思路是数组转字符串再转Number类型,之后加一,再转回原来的数组
-
第一次解题代码如下:
var plusOne = function(target) {
const lastNumber = Number(target.join('')) + 1;
const lastResult = String(lastNumber).split('');
return lastResult
};
-
这里的解题思路是有问题的,问题出在,一旦转换类型,Number是有最大最小值的,即有效值,我查了一下为:
9007199254740992
(16 位数),而题目中的数组的长度不止16位,而在JS中 超过最大值后,计算会出现不精确的问题。 -
因为按题目,需要最后一位
+1
,所以我们从结尾开始循环遍历,直到i
小于0
的时候终止循环。 -
每次循环自增+1以后,我们需要判断当前位是否满10,是否需要进1,所以我们会先让其
(末位 + 1) % 10
。因为我们知道,1
至9
中任意的数% 10
,得到的答案还是1 - 9
,但是10 % 10
,得到的答案是0
!
解题代码:
var plusOne = function(digits) {
for (let i = digits.length - 1; i >=0; i--) {
digits[i]++;
digits[i] = digits[i] % 10;
if (digits[i] > 0) {
return digits;
}
}
return [1, ...digits];
};
执行测试:
digits
:[9, 9, 9]
return
:[1, 0, 0, 0]
3、每日一题
webpack有哪些优点,缺点
webpack有哪些优点
- 专注于处理模块化的项目,能做到开箱即用,一步到位
- 可通过plugin扩展,完整好用又不失灵活
- 使用场景不局限于web开发
- 社区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展良好的开发体验
webpack的缺点
- 只能用于采用模块化开发的项目