快速比较数组中连续数字及其计数

时间:2018-11-26 08:19:50

标签: arrays swift filter

如何比较数组中的两个连续数字并找到其计数。

let numberArray = [1,2,4,6,7,10,12,13]
// I want to compare two consecutive numbers like [1,2], [4,6], [7,10], [12,13]

例如:
首先,我要计算数组中前两个数字[1,2(difference = 1)]的差,然后计算后两个数字[4,6(difference = 2)],然后计算[7,10(difference = 3)]和最后[12,13(difference = 1)]。
最后,我要计算一个具有1的差值。在这种情况下,计数为2。

我应该使用哪种方法?

先谢谢了。

4 个答案:

答案 0 :(得分:0)

我敢肯定,有更好的方法可以做到这一点(但这是星期一早上)。 一种简单的解决方案是使用跨步循环遍历数组,使您可以从两个步骤开始。 然后,将每个差异附加到新的差异数组中。 最后,在此结果数组上使用过滤器来确定这种差异出现的频率。

let difference      = 1
let array           = [1,2,4,6,7,10,12,13]
var differenceArray = [Int]()
for index in stride(from: 1, to: array.count, by: 2) {
    let difference  = array[index]-array[index-1]
    differenceArray.append(difference)
}

print(differenceArray.filter{ $0 == difference }.count)

答案 1 :(得分:0)

通过answerMartin R,您可以按照以下方法检查如何创建配对,

let input = [1,2,4,6,7,10,12,13]
let output = stride(from: 0, to: input.count - 1, by: 2).map{(input[$0], input[$0 + 1])}

现在您可以创建差异数组并找到一个计数,如下所示,

let differences = output.map({ $0.1 - $0.0 })
let onesCount = differences.filter({ $0 == 1}).count

print(differences)
print(onesCount)

输出

[1, 2, 3, 1]
2

答案 2 :(得分:0)

@Philip的回答很好。这是一个更新的解决方案,也可以处理其他情况。

let numbers = [1, 2, 5, 4, 10, 6, 7, 8, 11, 10, 23]
var allDifference: [Int] = []
for index in stride(from: 0, to: numbers.count, by: 2) {
   let firstValue = numbers[index]
   let secondValue = ((index == numbers.count - 1 && numbers.count % 2 != 0) ? 0 : numbers[index + 1])
   allDifference.append(abs(firstValue - secondValue))
}

let oneDifferenceCount = allDifference.filter { $0 == 1 }.count
print("Result: ", oneDifferenceCount)

答案 3 :(得分:0)

您可以使用zip compactMapreduce用两行代码来实现:

首先我们创建一个连续元素的元组,我们使用zip来使用元素的索引,并使用compactMap来过滤nil元素,然后减少新数组的数量只有差异为1的元组

//Create tuples of consecutive values
let tuples = zip(numberArray.indices, numberArray).compactMap{$0 % 2 == 0 ? nil : (numberArray[$0-1],$1) }
// reduce to count only the tuples with difference of 1
let diffOneCount = tuples.reduce(0,{$1.0+1 == $1.1 ? $0+1 : $0})