Swift中array(repeating:0)与空数组的区别及sortedSquares算法疑问
关于Swift中数组初始化方式的区别解答
首先纠正你代码里的一个小错误:Swift中创建指定数量重复元素的数组,正确写法是Array(repeating: 0, count: array.count),你写的from和by参数是不存在的,应该用count指定元素个数。
下面直接说两种初始化方式的核心区别:
1. 内存分配与性能
Array(repeating: 0, count: array.count):初始化时就直接分配了能容纳array.count个元素的内存空间。后续操作中如果只是替换现有元素(通过下标赋值),不会触发内存重新分配,性能更稳定,尤其当原数组长度较大时,能避免多次扩容的开销。sortedSquares = []:初始是空数组,Swift会给它分配一个很小的默认容量(通常是0或4)。每次调用append()添加元素时,如果当前容量不够,就会重新分配一块更大的内存,把现有元素复制过去。频繁扩容会增加额外的性能消耗。
2. 使用方式的差异
- 用
repeating初始化的数组,已经有了array.count个初始值(这里是0),你需要通过下标替换元素,比如:sortedSquares[i] = array[i] * array[i] - 空数组的话,你需要用append()方法添加新元素,比如:
sortedSquares.append(array[i] * array[i])
结合你的算法题场景
你的题目是返回元素平方后的数组,最终数组长度和原数组完全一致,这种场景下优先用Array(repeating: 0, count: array.count)更合适。比如做双指针法(最优解,时间复杂度O(n))的时候,直接在提前初始化的数组里从后往前填充平方值,逻辑更顺畅:
func sortedSquares(_ array: [Int]) -> [Int] { var result = Array(repeating: 0, count: array.count) var left = 0 var right = array.count - 1 var idx = array.count - 1 while left <= right { let leftSq = array[left] * array[left] let rightSq = array[right] * array[right] if leftSq > rightSq { result[idx] = leftSq left += 1 } else { result[idx] = rightSq right -= 1 } idx -= 1 } return result }
如果用空数组,你可能需要先把所有平方值append进去再排序,这样时间复杂度就变成O(n log n),不如双指针法高效。
内容的提问来源于stack exchange,提问作者ELLIOT RAPP
相关产品推荐
相关产品推荐

