首页 > 解决方案 > 快速比较数组中的索引

问题描述

我有一个数字数组,我想检查其中的数字index 1是否等于数字index 2,如果是,我想将我的计数器增加 1。我已尽我所能,但无法提出正确的逻辑

这是我迄今为止尝试过的

let c: [Int] = [0, 0, 0, 0, 1, 0]

for (index, val) in c.enumerated() {
        print(val)
        var counts = 0
        if c.firstIndex(of: index) == c.index(after: index) {
            print("yes")
            counts += 1
            print(counts)
        }
    }

所以比较 0index 0到 0index 1计数器加 1,
然后 0index 1到 0index 2计数器加 1,
然后 0index 2到 0index 3计数器加 1 ,
然后 0index 3到 1index 4 跳过,
然后 0index 3到 0index 5计数器加 1

标签: swift

解决方案


手头的问题

在您的情况下,特定问题是找到inc.firstIndex(of: index)的第一个索引。我想你打算写 ,但即使这样也行不通。例如,如果你问,它总是会给你,即使你在数组的中间,因为在你的测试用例中,第一个元素总是在 index 。indexcc.firstIndex(of: val)c.firstIndex(of 0)000

另一个问题是你count在循环范围内,这意味着每次迭代都有自己的独立count变量,初始化为,在重新初始化之前0,它最多会递增到1

更清洁的解决方案

这是更实用的风格的理想案例。它更简单,但也很元素。

解决方案是一连串的 4 个步骤:

  1. 使用该zip(a, a.dropFirst())模式,对于a由 组成的数组[1, 2, 3, 4, 5],它将产生一个由成对的相邻元素组成的数组,例如[(1, 2), (2, 3), (3, 4), (4, 5)]

  2. 从那里开始,检查每一对以查看它们的两个元素是否相同。如果是,我们将它们更改为 a 0,否则为 a 1

  3. 然后我们只需将这些数字相加即可获得最终结果。

  4. 理想情况下,我们将此代码打包成一个函数,并使其具有通用性,以便轻松重用。

因此我们得到:

extension Sequence where Element: Equatable {
    func countOfAjacentDifferingElements() -> Int {
        return zip(self, self.dropFirst())
            .lazy
            .map { $0 == $1 ? 1 : 0 }
            .reduce(0, +)
    }
}

let numbers = [0, 0, 0, 0, 1, 0]
print(numbers.countOfAjacentDifferingElements()) // => 2

推荐阅读