Java - addDigits方法的大O?

时间:2017-06-13 04:30:36

标签: java recursion

这段代码的大O是什么?我认为它的O(logn)因为每次递归,num得到/ = 10.否则,它必须是O(n)。有什么想法吗?

P.S:不是作业问题,只是面试的修改。所以答案很受欢迎。

public class Solution {
    public int addDigits(int num) {
        int sum = 0;
        while (num > 0){
            sum += num % 10;
            num /= 10;
        }
        if (sum < 10){
            return sum;
        }
        else{
            return addDigits(sum);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我认为O(logn)是正确的答案,因为O(logn)只会在计算第​​一个while时覆盖第一个sum循环。但是当sum大于10时,如果新的O(log(sum))大于10,你将进行另一轮计算,即sum +另一轮计算。所以:

  • 第一个计算是logn
  • 第一个总和将小于9 * logn(例如,如果第一个数字是4位数,它将小于9999,因此第一个总和将小于9 * 4),所以第二次计算最多为log(9 * logn)+第二次和的计算
  • 第二个总和将小于9 * log(9 * logn),因此第三个计算将至多为log(9 * log(9 * logn))+第三个和的计算。
  • 等等等

所以最终值似乎是O(logn + log(logn) + log(log(logn)) + ...) - 它会在日志(log(...(logn)..))= 0时停止。