当前位置:   article > 正文

加一算法

+1算法

leetcode 66题目

题目:

  1. 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
  2. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
  3. 你可以假设除了整数 0 之外,这个整数不会以零开头。
  4. 复制代码

分析:

其实就是用数组来保存 10 进制数,并且实现对这个 10 进制数的加 1 算法。

比如:

  1. 输入: [9]
  2. 输出:[1, 0]
  3. 输入: [1, 2, 3]
  4. 输出:[1, 2, 4]
  5. 复制代码

解题

看到这个题目的时候,我很简单的想把数组转成字符串然后再转成数字进行操作,写了如下代码:

  1. function plusOne (digits) {
  2. const num = Number(digits.join('')) + 1
  3. return num.toString().split('')
  4. }
  5. 复制代码

代码很简单,简单测试了一下上面的两个测试用例发现没有问题,便提交了。 但是,这就是悲剧了,这道题目还是有个很明显陷阱的:

  1. 输入: [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]
  2. 输出: [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]
  3. 预期: [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4]
  4. 复制代码

我们看到这里数组 [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3] 的长度超过了 js 可表示最大精度的长度 16

  1. Number.MAX_SAFE_INTEGER.toString().length
  2. => 16
  3. 复制代码

所以上面这种单纯的通过数字计算方式并不正确,因而我们还是通过简单遍历数组的方式进行求解。

这里有几个需要注意的点:

  1. 要从数组的尾部开始遍历

  2. 每一位计算时需要知道上一位是否有进位

  3. 每一位值保存个位数

  4. 遍历完成之后还需要判断是否顶上一位数字计算也有进位

代码如下:

  1. function plusOne (digits) {
  2. // 默认最后一位加 1
  3. let is_plus = true
  4. const first_index = digits.length - 1
  5. for (let i = first_index; i >=0; i--) {
  6. if (is_plus) {
  7. digits[i]++
  8. }
  9. is_plus = digits[i] >= 10
  10. if (is_plus) {
  11. digits[i] %= 10
  12. }
  13. }
  14. // 判断是否还有存留进位
  15. if (is_plus) {
  16. digits.unshift(1)
  17. }
  18. return digits
  19. }
  20. 复制代码

总结

解题时不要想当然,面对数字计算问题一定要注意精度丢失问题。

转载于:https://juejin.im/post/5ca7fc30e51d455fb90d6ab3

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/63441
推荐阅读
相关标签
  

闽ICP备14008679号