下面程序的时间复杂度是多少?

What's the time complexity of below program?

这个程序的时间复杂度是多少?我们根据任意大的输入来计算时间复杂度。在此示例中,输入字符串可能非常大,但如果它没有空格,则它只是 O(n)。如果字符串有空格,它将是 O(n * numberOfWords),我可以将其视为 O(n^2) 时间复杂度吗?提前致谢!

    public static String revEachWord(String str) {
        String reversed = "";
        String[] words = str.split(" ");
        
        for(String word : words) {
            String reversedWord = "";
            for(int i = word.length() - 1; i >= 0; i--) {
                reversedWord += word.charAt(i);
            }

            reversed += reversedWord + " ";
        }
        
        return reversed.trim();
    }

O(numberOfWords * averageWordLength)

Aleksey O(numberOfWords * averageWordLength)。这是正确的(如果我们暂时忽略 +=),但更一般的答案是根据输入的长度 n。由于 n = numberOfWords * averageWordLength,我们可以说它是 O(n),或线性的。

但这并不完全正确。正如 chrylis 在评论中指出的那样,由于您正在使用 += 构建字符串,因此需要更长的时间:每个副本 O(n) 和总副本 numberOfWords,总共 O(n * numberOfWords),或者在最坏的情况下 O(n^2)。 (实际上,它可能比那更糟;我没有考虑嵌套循环中的 +=。)哎呀。最好开始使用 StringBuilder 以获得美好的 O(n) 运行 时间。