Leetcode 258

给定一个非负整数 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

猜你喜欢

转载自blog.csdn.net/jhlovetll/article/details/84180987