「前端刷题」258.各位相加(EASY)

85 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

题目(Add Digits)

链接:https://leetcode-cn.com/problems/add-digits
解决数:1275
通过率:71.1%
标签:数学 数论 模拟 
相关公司:amazon adobe bytedance 

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

 

示例 1:

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

示例 1:

输入: num = 0
输出: 0

 

提示:

  • 0 <= num <= 231 - 1

 

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

思路

思路1,暴力

各数字之和

function addNumber(num) {
    let sum = 0
    for (let item of num ) {
        sum += +item
    }
    return sum
}
function addNumber(num) {
    return (num + '').split('').reduce((p, i) => p + +i, 0)
}

思路2,好理解的

/**
 * @param {number} num
 * @return {number}
 */
var addDigits = function(num) {
    var nums = '' + num;
    var add = 0;
    var end = 0;
    for (var i = 0; i < nums.length; i++) {
        add += Number(nums[i]);
    }
    
    add = '' + add;
    for (var i = 0; i < add.length; i++) {
        end += Number(add[i]);
    }
    return end >= 10 ? addDigits(end) : end
};

思路3

  1. 最终答案肯定为0-9
  2. 只有0才能得到0,其他数字只要有数就永远不会加出0,那么其他数字只能对应1-9
  3. 函数满足 f(a + 1) = f(a) + 1 (这里结果的10看作1)

结果只能是1-9的无限循环

9个一循环,也就是f(a + 9) = f(a),那么我们抛去加的多余的9,结果一致,即f(a) = f(a % 9) (这里结果的f(0)看作9)

/**
 * @param {number} num
 * @return {number}
 */
var addDigits = function(num) {
    return num == 0 ? num : (num - 1) % 9 + 1
};
class Solution:
    def addDigits(self, num: int) -> int:
        return (num - 1) % 9 + 1 if num else num
class Solution {
    public int addDigits(int num) {
        return num == 0 ? num : (num - 1) % 9 + 1;
    }
}
func addDigits(num int) int {
    if num == 0 {
        return num
    } else {
        return (num - 1) % 9 + 1
    }
}

思路4

0               0
1-9             1-9
10-18           1-9
19-27           1-9

可以看出来1-9轮回,如果是9的倍数,就是9,否则就是num%9,0需要特殊处理。

代码

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