如何比较数组中的两个连续数字并找到其计数。
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。
我应该使用哪种方法?
先谢谢了。
答案 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)
通过answer的Martin 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
compactMap
和reduce
用两行代码来实现:
首先我们创建一个连续元素的元组,我们使用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})