我试图在不使用高阶函数的情况下比较Swift中两个不同数组中的元素。该函数应返回两个数组中的整数数组。我认为我很接近,但我得到了一个索引输出范围错误。还想知道这个衡量时间复杂度的方法
let arrayOne = [1, 5, 12, 3, -15 , 52, 20]
let arrayTwo = [3, 1, 6, 5, 57, 13, 17, 20]
func compareElementsInArray(array1:[Int], array2: [Int]) -> [Int] {
let totalArray = array1 + array2
var sortedArray = totalArray.sorted()
var results = [Int]()
for i in totalArray {
if sortedArray[i + 1] == sortedArray[i] {
results.append(sortedArray[i])
}
}
return results
}
compareElementsInArray(array1: arrayOne, array2: arrayTwo)
答案 0 :(得分:1)
问题是您正在遍历end
的所有元素,这意味着totalArray
将到达i
的最后一个索引,那么您正试图访问totalArray
i+1
的第_个元素,其长度与sortedArray
相同,因此出错。
你需要在最后一个之前的索引处停止循环,而不是最后一个循环。
totalArray
但是,您可以使用func compareElementsInArray(array1:[Int], array2: [Int]) -> [Int] {
let totalArray = array1 + array2
var sortedArray = totalArray.sorted()
var results = [Int]()
for i in 0..<totalArray.count-1 {
if sortedArray[i + 1] == sortedArray[i] {
results.append(sortedArray[i])
}
}
return results
}
print(compareElementsInArray(array1: arrayOne, array2: arrayTwo))
来实现相同的高阶函数(您的解决方案实际上并没有使用更高阶函数)。
您只需要从数组的组合中创建一个计数集,然后使用NSCountedSet
到flatMap
计数大于1的元素和filter
结果map
1}}。
[Int]