258 - 各位相加(add-digits)

Create by jsliang on 2019-07-18 16:14:35
Recently revised in 2019-07-18 16:48:04

一 目录

不折腾的前端,和咸鱼有什么区别

目录
一 目录
二 前言
三 解题
四 执行测试
五 LeetCode Submit
六 知识点
七 解题思路
八 进一步思考

二 前言

返回目录

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:
输入: 38
输出: 2 

解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

三 解题

返回目录

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

  • 解题代码
var addDigits = function(num) {
  while (num > 9) {
    num = num.toString().split('');
    num = num.reduce((prev, next) => {
      return Number(prev) + Number(next);
    });
  }
  return num;
};

四 执行测试

返回目录

  1. num38
  2. return2

五 LeetCode Submit

返回目录

✔ Accepted
  ✔ 1101/1101 cases passed (88 ms)
  ✔ Your runtime beats 98.66 % of javascript submissions
  ✔ Your memory usage beats 29.54 % of javascript submissions (35.8 MB)

六 知识点

返回目录

  1. toString()toString() 返回一个字符串,表示指定的数组及其元素。toString() 详细介绍
  2. split()split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。split() 详细介绍
  3. reduce()reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。reduce() 详细介绍
  4. Number:将其他值转成数字值。Number 详细介绍

七 解题思路

返回目录

断网断电也不能阻止我刷题的乐趣!2019-07-18。

首先,今天下午停网停电,开着热点刷题。

然后,这道题的解法其实没那么难。

  1. 将数字转换成字符串,然后通过字符串的 split('') 方法,将字符串转换成数组。
  2. 通过 reduce 计算数组中每个元素的总和。因为 split('') 切割出来的是 String 类型的,所以需要通过 Number 强制转换。
var addDigits = function(num) {
  while (num > 9) {
    num = num.toString().split('');
    num = num.reduce((prev, next) => {
      return Number(prev) + Number(next);
    });
  }
  return num;
};

最后,返回结果即可。

八 进一步思考

返回目录

黑暗中的我思考:除此之外,还有没有其他题解呢?

是时候看看大佬们的奇技淫巧了:

解法 1:数学

var addDigits = function (num) {
  if (num == 0) {
    return 0;
  }
  num %= 9;
  if (num == 0) {
    return 9;
  }
  return num;
};

震惊!为什么可以这样解题呢?!!!

解法 2:数学

var addDigits = function (num) {
  return num == 0 ? 0 : (num - 1) % 9 + 1;
};

卧槽!精确到一行了!!!

解法 3:递归

var addDigits = function (num) {
  var sum = 0;
  while (num > 0) {
    var digit = num % 10;
    sum += digit;
    num = (num - digit) / 10
  }
  if (sum >= 10) {
    return addDigits(sum)
  } else {
    return sum
  }
};

也是可行,但是想来应该比不上我想的代码,毕竟递归浪费的时间更多(虽然我没有网络可以提交证明~)

以上,就是这道题的题解啦~


不折腾的前端,和咸鱼有什么区别!

图

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

知识共享许可协议
jsliang 的文档库梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。

Copyright © jsliang.top 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-07-18 16:48:04

results matching ""

    No results matching ""