前端算法-各位相加

706 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第37天,点击查看活动详情

题目

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

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

思路一

我们这里的可以使用循环结合递归来实现,我们在函数内部先判断一下形参num是否小于10,如果小于10就是1位数,我们不需要做任何操作,直接将其返回即可,如果不是小于10,我们就先声明一个sum变量,默认值为0,然后使用while循环进行判断,当前的形参num是否大于等1,如果是则进入循环,再循环内部我们将形参num除以10将其余数于sum变量相加且重新赋值给sum变量,然后再使用Math.floor方法进行向下取整,最后我们将sum数传递给自己函数,在进行循环即可

var addDigits = function(num) {
    if (num < 10){
        return num;
    } 
        let sum = 0;
        while (num >= 1){
            sum += num % 10;
            num = Math.floor(num/10); 
        }
       return addDigits(sum); 
};

思路二

我们这里还可以直接使用双循环,在函数中先声明一个n变量,他的值是形参num,然后使用while循环,循环条件为当前的n值大于等于10则进入循环,在循环中我们在声明两个变量,分别为x和y,x的值是变量n使用toString()方法后的返回值,然后再使用循环对x变量进行循环,在循环中我们把当前x的循环值使用parseInt方法转换为数字,然后在和y进行相加并重新赋值给y变量,最后将变量y赋值给变量n,当循环结束后,我们将变量n返回出去即可

var addDigits = function(num) {
    let n = num
    while(n >= 10){
       var x = n.toString()
       var y = 0
        for(let i = 0 ; i < x.length; i++){
            y += parseInt(x[i]);
        }
        n = y
    }
    return n
};