首页 > 解决方案 > Swift:在数组中追加项目的算法

问题描述

我需要使用特定算法将项目附加到数组中:

起始索引 == 2 和分隔符 == 5

例如输入数组:

["1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"]

例如输出数组:

["1", "1", "X", "1", "1", "1", "1", "1", "X", "1", "1", "1", "1", "1", "X", "1", "1", "1", "1"]

这是我的代码,但我找不到让它正常工作的方法,期待一些帮助

var mixStartIndex = 2
var mixSeparator = 5

let array = ["1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"]
var result = [AnyObject]()
for (index, item) in array.enumerated() {
    if (index > mixStartIndex+mixSeparator && index % mixSeparator == 0) || index == mixStartIndex {
        result.append("X" as AnyObject)
    }
    result.append(item as AnyObject)
}
print(result)

PS我正在处理对象,为了简单起见,我只是用字符串举例

标签: arraysswiftalgorithmgenetic-algorithm

解决方案


创建数组的功能解决方案,其中元素插入到结果数组中:

let result: [String] = array.enumerated().reduce(into:[]) { acc, elm in
    let tempo = ((elm.offset - 2) % 5 == 0 ? ["X"] : []) + [elm.element]
    acc.append(contentsOf: tempo)
}

如果您不想插入,而是想替换元素:

let result = array.enumerated().map {
    ($0.offset - 2) % 6 == 0 ? "X" : $0.element
}

Array.insert(_:at:)

我们可以使用内置函数Array.insert(_:at:)

let newCount = array.count > 2 ? array.count + 1 + (array.count - 3) / 6 : array.count

var index = 2
let mixSeparator = 6

var result = array

while index < newCount {
    result.insert("X", at: index)
    index += mixSeparator
}

但这将是低效的,不仅因为你整个数组然后开始插入,还因为insert(_:at:)它是一个 O(n) 操作。这意味着插入索引之后的所有元素都应该移动。更有效的解决方案是迭代地进行插入:


迭代插入

这是一个非常容易理解的迭代解决方案:

let array = ["1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"]

var result = array
let x = "X"

let startIndex = 2
let step = 6

var count = 0
var index = 2

while index < array.count {
    result[index] = x
    count += 1
    index += step
}

result.append(contentsOf: Array(repeating: "1", count: count))

或者,如果您想result一次性创建数组:

let newCount = array.count > 2 ? array.count + 1 + (array.count - 3) / 6 : array.count

var result = [String]()
result.reserveCapacity(newCount)

let startIndex = 2
let step = 6

var nextIndexToPutX = startIndex
var index = 0

while index < newCount {
    if index == nextIndexToPutX {
        result.append("X")
        nextIndexToPutX += step
    } else {
        result.append("1")
    }
    index += 1
}

迭代替换

var result = [String]()
result.reserveCapacity(array.count)

var nextIndexToPutX = 2
let step = 6

var index = 0

while index < array.count {
    if index == nextIndexToPutX {
        result.append("X")
        nextIndexToPutX += step
    } else {
        result.append(array[index])
    }
    index += 1
}

推荐阅读