arrays - 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我正在处理对象,为了简单起见,我只是用字符串举例
解决方案
创建数组的功能解决方案,其中元素插入到结果数组中:
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
}
推荐阅读
- html - 如何对不同输入类型的 data-price 值求和?
- r - 如何更改ggboxplot中箱线图的顺序?
- python - 如何仅使用 NumPy 和 PIL 将过滤器应用于 .jpg 图像
- c# - 如何在单元测试期间设置 HttpResponseMessage 的内容?
- c# - 字符串应该如何以大写字母开头并且超过 2 个字符?
- node.js - ReactDOM.render(
, , 元素); 给出目标容器不是 DOM 元素 - javascript - 如何将多个 g-sheet 中的数据合并为一个?
- python - pyspark.sql.utils.ParseException: u"\nmismatched inpu
- laravel - 如何使用 Laravel 中的工厂填充多种语言的数据库字段?
- kubernetes - 为什么 Kubernetes pod 重启时 Kafka 主题会失去领导选举?