从书中的解决方案使用INSERT方法来反转在位置0添加的数组0然后将所有元素移至右侧1时间,即O(n)。

    func reversed(_ array: [Int]) -> [Int] {
  var newArray: [Int] = []
  for item in array {
    newArray.insert(item, at: 0)
  }
  return newArray
}

使用Append方法是否更好?

    func kreversed(_ array: [Int]) -> [Int] {
  var newArray: [Int] = []
    
    let position = array.count - 1
    
    for index in array{
        newArray.append(array[position - index])
    
    }
  
    return newArray
}

一点改进版本

func reversed(_ array: [Int]) -> [Int]{
var newArray:[Int] = []

var counter = array.endIndex - 1

for _ in array{
    newArray.append(array[counter])
    counter -= 1
}

return newArray

}

你好 @surepic.,感谢您与社区共享另一种解决方案,欢迎来到论坛!

你好!感谢您分享SUSCPIC。是的,您的版本更高效!

你可以通过电话更快地稍微更快

newArray.ReservEcapacity(array.count)

那样,附加不需要担心进行分配。根据尺寸,如果它不知道尺寸,则可能必须执行多个重新分配和副本。

顺便说一句,如果你作弊并使用标准库(你应该在练习!)你可以这样做

func reversed(_ array: [Int]) -> [Int] { Array(array.reversed())  }

The method reversed() is O(1) and returns a lazy ReversedCollection<Array<Int>>. Then you initialize that with an array that iterates through the reverse collection (as you have done) and constructs the Array in one go. It has the same good performance characteristics as your hand rolled loop. :微笑:

很高兴你正在考虑表演!

但是这种方式array.count正在被调用它应该再次开始计数。
正如我用EndIndex-1那样了解的那样,它将更快地获得它的哈希。

可能是错误的,但到目前为止明白。

count 是O(1)用于随机访问。它实际上实现为EndIndex - StartIndex,因为Collections可能无法从零启动,就像arrayslice的情况一样。

很高兴知道!谢谢

这一主题在166天后自动关闭。不再允许新的回复。