您说foo
函数的时间复杂度是什么(相对于n
)?
DIGIT_FACTORIAL = [1]
for x in range(1, 10):
DIGIT_FACTORIAL.append(DIGIT_FACTORIAL[x-1]*x)
def digit_factorial(x):
return DIGIT_FACTORIAL[x]
def foo(number_of_digits):
n = 10**number_of_digits
i = n//9
while i != sum(digit_factorial(int(x)) for x in str(i)) and i < n:
i += 1
if i < n:
return i
return None
答案 0 :(得分:2)
O(n log(n))
每个while
循环都从111...1 == n/9
到n
运行。这意味着while循环运行n*8/9
次。 O(n * some_constant)== O(n)。
在每次迭代中,总和超过i
中的所有数字。 log10(n) - 1
中有i
个数字。 O(log10(n)-1)== O(log(n))。
嵌套这两个使 O(n log(n))。
请注意,以上说明并未考虑如果使用i == sum(...)
,循环可能会提前中断。这是因为sum(digit_factorial(int(x)) for x in str(i))
的上限是9! * number_of_digits
,当i
大于7左右时,它总是小于number_of_digits
。