给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入:38
输出: 2 解释: 各位相加的过程为:3 + 8 = 11
,1 + 1 = 2
。 由于2
是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
方法一:直接使用递归,效率可以接收
class Solution(object):
def addDigits(self, num):
"""
:type num: int
:rtype: int
"""
if len(str(num)) == 1:
return num
temp = 0
for item in str(num):
temp += int(item)
return self.addDigits(temp)
方法二:
分析题目的概念,
设 n = 10000*a + 1000*b + 100*c+ 10*d + e*1
等价为:n = a + b + c + d + e + (9999a + 999b + 99c + 9d)
那么可知,n和 a+b+c+d+e(即n的各个位数之和)模9同余
所以只要对n不断地进行模9的操作,最终会得到 n = n1 + n2,其中n1为0-8之间任意数,n2可以被9整除
然而题意中各个位数之和最终得到的各位数的范围应为1-9的整数 ,可做以下变换:
n % 9 = [(n - 1) + 1] % 9 = (n - 1) % 9 + 1 % 9 = (n - 1) % 9 + 1
class Solution(object):
def addDigits(self, num):
"""
:type num: int
:rtype: int
"""
if len(str(num)) == 1:
return num
else:
return (num - 1) % 9 + 1