每日一题 258.各位相加

219 阅读2分钟

258.各位相加——Golang

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

难度:简单

示例1:

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

示例2:

输入: num = 0
输出: 0

提示: 0<=num<=23110<=num<=2^{31}-1

进阶: 不使用递归或者循环,在O(1)复杂度内解决该问题。

解法1:

(1)对数字num的各位进行相加; (2)若相加后的结果小于10则返回; (3)否则循环步骤(1)直至各位相加后的数小于10. 例如:12345 => 1+2+3+4+5=15 => 1+5=6, 返回10

func addDigits(num int) int {
    for num >= 10 {
        ans := 0
        for num >= 10 {
            ans += num%10
            num /= 10
        }
        num = ans
    }
    return ans
}
​

解法2:

num可表示成如下形式: num=i=1kai10i=i=1kai(10i1+1)=i=1kai(101)i+i=1kai\\num = \sum_{i=1}^k a_i*10^{i}\\= \sum_{i=1}^k a_i*(10^{i}-1+1)\\= \sum_{i=1}^k a_i*(10-1)^{i} + \sum_{i=1}^k a_i

其中i=1kai\sum_{i=1}^k a_i是num的各位相加的和;

其中ai(101)ia_{i}*(10-1)^{i}必定是9的倍数即对9取余必为0,所以num%9的结果等于(i=0kai)(\sum_{i=0}^{k}a_{i})%9的结果,即num与其各位相加的结果模9同余。

重复计算各位相加的结果直到结果为一位数时,该一位数即为num的数根,num与其数根模 9同余。

注意:

(1)当num不是9的倍数时,num的树根=num%9;

(2)当num=0时,num%9=0,但答案ans=0;

(3)当num>0且num%9==0时,答案ans=9(9的倍数的数各位相加最后得到的一位数必为9)

func addDigits (num int) int {
    if num < 10 {
        return num
    }
    ans := num % 9
    if num == 0 {
        ans = 9
    }
    return ans
}

注意: 当 num>0 时,其数根的结果在范围[1,9]内,因此可以计算 (num-1)%9的结果然后加1。由于当 num>0时,num-1≥0,非负数除以9的余数一定也是非负数,因此计算 num−1除以9的余数然后加1的结果是对的。对于Go语言,对负数取余的结果的正负和左操作数相同,即-1%9=-1,再加上1也为正确结果。

func addDigits (num int) int {
    return (num - 1) % 9 + 1
}