【发布时间】:2021-08-25 01:35:40
【问题描述】:
长话短说,我正在寻找验证以下代码的时间复杂度是否正确。
class Solution {
public String reverseWords(String s) {
int len = s.length(); int i=len-1, j=0;
StringBuilder answer= new StringBuilder();
while(i!=-1) {
if(s.charAt(i)==' ') i--;
else {
j=i;
while(j-1!=-1 && s.charAt(j-1)!=' ' ) j--; //j++;
answer.append(s.substring(j, i+1)).append(' ');
i=j-1;
}
}
return answer.toString().trim(); //trim last index's space
}
}
约束:
1 <= s.length <= 10^4-
s包含英文字母(大写和小写)、数字和空格“ ”。 -
s中至少有一个单词
假设字符串长度为 N。 我的分析是进一步假设字符串 S 中有 K 个空格,并假设其中有 L 个不同的空格分隔的单词,根据给定的约束我们可以得出 L>=1 和 K>=0 的结论。
因此每个单词的平均长度为 NK/L,因此外部循环运行 K+L 次,内部循环独立于外部运行 2*(NK)/L 次,使总复杂度为 2(NK)/ L + K+L 仍然是 O(N) 的阶数。
我是否做出了错误的假设?有没有办法简化这个公式2*(N-K)/L + K+L
【问题讨论】:
-
我没有仔细看,但我的第一个想法是你可以/应该简单地根据 N 来分析这个。 K 和 L 让我觉得过于复杂了。
-
如果你使用 K 和 L 那么你需要解释如何将 2(NK)/L+K+L 减少到在)。不要挥手那一步。
-
如果
N是您的String s中的字符数,那么代码将遍历所有这些字符一次。因此,整体复杂性将只是O(N)。摆脱 K 和 L 将帮助您简化这一点。换句话说,与您的假设相关,您的外部循环遍历字符串中的每个“单词”,内部循环遍历这些单词的每个“字符”。有效输入字符串N的所有字符。 -
@JohnKugelman 当我们有一个由单个字母组成并由单个空格分隔的字符串时,k 和 l 不会变得重要。基本上当 k=n/2 和 l=n/2 时,我们不应该考虑吗?
-
@JohnKugelman 我将它们简化为 O(N) 只是因为没有输入大小 N 的二次项,因此可以将渐近最紧界视为 O(N) ,或者我错过了什么?
标签: java performance time-complexity big-o