在刷leedcode的时候,因为一行代码的细微差异,导致空间占用太高,无法通过:ans = ans + stak[i]
,将 ans = ans + stak[i];
改为 ans += stak[i];
就通过了。查资料发现这两种写法影响的差异。如下。
原代码
cpp复制代码
ans = ans + stak[i];
这个写法会创建一个新的字符串对象来存储 ans
和 stak[i]
的拼接结果,然后将这个新字符串赋值给 ans
。具体来说,每次执行这行代码时会发生以下操作:
- 创建一个新的临时字符串,将
ans
的当前内容复制到该临时字符串。 - 将
stak[i]
追加到临时字符串的末尾。 - 将临时字符串赋值给
ans
。
这个过程涉及多次内存分配和数据复制,尤其是在字符串 ans
不断增长时,代价很高,时间复杂度为 O(n^2)
。
改进后的代码
cpp复制代码
ans += stak[i];
这个写法通过直接在 ans
上追加字符来避免上述不必要的操作。+=
操作符会尝试在当前字符串对象的内部存储中追加字符,如果内部存储空间不足,则会一次性分配更多空间以容纳新字符,这样可以减少内存分配的次数。
效果
- 减少内存分配:每次追加字符时不再创建新的字符串对象,而是在原字符串上直接操作,减少了内存分配的次数。
- 提高性能:避免了多次的字符串复制操作,时间复杂度降为
O(n)
。