You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:21:11