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

示例:

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

这个直接用循环来做非常快,题目进阶要求说不使用循环和递归,且要求时间复杂度O(1)之内解决

直接上很秀的解法

1
2
def func(num):
return (num%9) or (9*bool(num))

假设原来的数是abcd即,1000*a+100*b+10*c+d之后我们需要的数字是a+b+c+d

所以a+b+c+d=(1000*a+100*b+10*c+d)-(999*a+99*b+9*c)='abcd'-9*(111*a+11*b+c) 就相当于a+b+c+d=num%9

如果num是9的倍数怎么办呢?num是0怎么办呢?

9的倍数的各位数的和就是9,而此时num%9==0,所以直接使用9*bool(num)

最后一个or 把句子缩写到一行,leecode大神写的代码真是太优雅了