arrays - 如何拆分奇数数组
问题描述
如果我有一个数组[-23,0,43,7,5,2,4]
,如何拆分数组 [奇数] [偶数]。我想要第一个数组中的 4 个元素和第二个数组中的 3 个元素。
我试图做这样的事情:
let leftArray = Array(mainArray[0..<mainArray.count/2])
let rightArray = Array(mainArray[mainArray.count/2..<mainArray.count])
我不断得到[-23,0,43]
和[7,5,2,4]
。
解决方案
我想你想把你的数组分成中间,对于奇数,让第一部分更大。使用这样的函数(故意拼写非常明确):
func splitArray(_ arr: [Int]) -> ([Int], [Int]) {
let count = arr.count
let half = count.isMultiple(of: 2) ? count / 2 : count / 2 + 1
let left = arr[0..<half]
let right = arr[half..<count]
return (Array(left), Array(right))
}
splitArray([-23,0,43,7,5,2,4]) // ([-23, 0, 43, 7], [5, 2, 4])
splitArray([-23,0,43,7,5,2,4,1]) // ([-23, 0, 43, 7], [5, 2, 4, 1])
这可以被简化并变得通用(即,适用于各种集合),如下所示:
extension Collection {
func splitHalf() -> (SubSequence, SubSequence) {
let count = self.count
let left = self.prefix(count / 2 + count % 2)
let right = self.suffix(count / 2)
return (left, right)
}
}
[-23,0,43,7,5,2,4].splitHalf() // ([-23, 0, 43, 7], [5, 2, 4])
[-23,0,43,7,5,2,4,1].splitHalf() // ([-23, 0, 43, 7], [5, 2, 4, 1])
"12345".splitHalf() // (.0 "123", .1 "45")
"123456".splitHalf() // (.0 "123", .1 "456")
推荐阅读
- flutter - Flutter中变量为真时如何显示列?
- docker - 我可以在 Docker 容器中创建一个文件系统,例如 xfs 作为集成测试的一部分吗?
- javascript - react native 中的新模态 onpress 标记
- python - Selenium 将回到范围的开头和 for i in range(1, 5)
- css - 退出 DIVI Visual Builder 时去除 CSS
- oracle - 如何在具有 118M 记录的非常大的表上更快地创建索引
- google-cloud-platform - Gcloud scp 无法使用 oslogin 2fa 登录
- c++ - 除最后一行外,所有行都正常工作,表示没有运算符“+”与操作数匹配
- sql-server - 可以在没有 SQL Server 或 Azure 数据工厂许可的情况下使用 SSIS?
- macos - 第一个 MacOS Apple 脚本:它可以工作,但不能关闭盖子