258. 各位相加(JavaScript)(含进阶)

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

示例:

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

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


解法一:循环

循环是最直接的想法。

/**
 * @param {number} num
 * @return {number}
 */
var addDigits = function(num) {
  var sum = 0;
  while(num !== 0) {
      sum += num % 10;
      num = parseInt(num / 10);
    }
  while (sum >= 10) {
    num = sum;
    sum = 0;
    while(num !== 0) {
      sum += num % 10;
      num = parseInt(num / 10);
    }
  }
  return sum;
};

解法二:探索规律 O(1)

先来几个例子。

4 -> 4

10 -> 1

18 -> 1+8 -> 9

27 -> 2+7 -> 9

28 -> 2+8 -> 10 -> 1

29 -> 2+9 -> 11 -> 2

36 -> 3+6 -> 9

发现惊人秘密!当 num 可以整除 9 的时候得到的结果都是 9 !

而不可以整除 9 的时候得到的结果都是 num % 9 !

于是,三次判断即可!时间复杂度为O(1) !

/**
 * @param {number} num
 * @return {number}
 */
var addDigits = function(num) {
  if (num === 0 ){
    return 0
  } else if (num % 9 === 0) {
    return 9;
  } else {
    return num % 9;
  }
};

 

全部评论

相关推荐

点赞 评论 收藏
分享
HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务