从这两个方面,我想知道哪一个在“时间复杂度”方面更好:
for(int i=0;i<n;i++){
s=s+"0";
}
和
for(int i=0;i<n;i++){
s+="0";
}
我正在解决一个问题,我在使用第一种方法时发现了“ TLE(超过时间限制)”,但在第二种方法中有效。
答案 0 :(得分:4)
第一个创建中间字符串(将在s
操作之后分配给+
),而第二个则可能不创建中间字符串(取决于字符串的容量)。
在两种情况下,最坏情况下的复杂度是相同的,在最佳情况下,它只是将第二种情况下的新字符串与第一种情况下的两个字符串的完整副本(+内存分配和免费)进行复制。>
您得到TLE
(超过时间限制)的事实可能是一直以来最糟糕的情况,始终复制大型字符串,而不是仅向现有的字符串添加内容(无需重新分配)。像向量一样,string
中应该有一些启发式的功能,以便事先获得足够的容量。
就像@Slava所说的,这个示例应该写成不同的方式,我想实际的代码是不同的。
答案 1 :(得分:1)
我知道这是一个老问题。但是对于任何其他人可能都需要答案,并且由于时差在解决比赛中的问题时确实很尖锐,所以我想提醒一下
s = s + "0";
进行O(len(s))次运算。和
s += "0";
取O(1)。
或者如果要在字符串的前面和后面追加,最好使用双端队列数据结构而不是字符串。