Вот краткое решение:
array.sorted { $1 == 0 * $0 }
Это O (n log n) .Это коротко, но не так быстро, как O (2 n) вашего подхода фильтра .
Более эффективное решение будет:
func zeroTail(_ array:[Int]) -> [Int] {
guard !array.isEmpty else { return array }
var tempo = Array(repeating: 0, count: array.count)
var index = 0
array.forEach { element in
if element != 0 {
tempo[index] = element
index += 1
}
}
return tempo
}
zeroTail([0,1,2,0,6,0,2,5,0]) //[1, 2, 6, 2, 5, 0, 0, 0, 0]
Обходит массив только один раз: O (n) .
partition
эффективен, но здесь он не подходит, поскольку он меняет элементы, которые belong in the second partition
, с другими, которые этого не делают.И это противоречит требованию сохранения исходного порядка ненулевых элементов.
Вы также можете определить расширение для Array в целом:
extension Array where Element: Comparable {
func withTail(_ value: Element) -> [Element] {
guard !self.isEmpty else { return self }
var tempo: [Element] = Array(repeating: value, count: self.count)
var index: Int = 0
self.forEach { element in
if element != value {
tempo[index] = element
index += 1
}
}
return tempo
}
}
И вот некоторыеварианты использования:
[0, 1, 2, 0, 6, 0, 2, 5, 0].withTail(0) //[1, 2, 6, 2, 5, 0, 0, 0, 0]
["c", "a", "c", "b", "c", "d", "c"].withTail("c") //["a", "b", "d", "c", "c", "c", "c"]
[1.2, 2.3, 4.5, 1.2].withTail(6.0) //[1.2, 2.3, 4.5, 1.2]
[Character]().withTail("a") //[]