Arrays 快速比较两个独立阵列的元素
我试图在Swift中比较两个不同数组中的元素,而不使用高阶函数。函数应返回两个数组中的整数数组。我想我很接近,但我得到了一个“指数超出范围的错误”。还想知道这是如何衡量时间复杂性的Arrays 快速比较两个独立阵列的元素,arrays,swift,algorithm,Arrays,Swift,Algorithm,我试图在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 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)
问题是,您正在迭代
totalArray
的所有元素,这意味着i
将到达totalArray
的最后一个索引,然后您试图访问sortedArray
的第i+1
个元素,该元素的长度与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))
为什么这个问题被否决了呢???
对于totalArray中的i{if sortedArray[i+1]==sortedArray[i]…
sortedArray.count==totalArray.count
,对吗?所以如果“i”是最后一个索引,你就不能执行totalArray[i+1]
,也不能执行sortedArray[i+1]
,这就是为什么您会遇到索引越界问题。此外,您的逻辑意味着arrayOne
或arrayTwo
中没有重复值。很高兴我能提供帮助。我还使用更高阶函数更新了我的答案,看看。时间复杂度有差异吗在这两种解决方案之间不,两者都是线性的(但我对NSCountedSet
的初始值不是100%),但由于您在问题中写道,您希望使用高阶函数编写一个解决方案,因此我想向您展示一个。如果有人想要相同的解决方案,可能需要指出的是,array1中的值必须是唯一的(array2中的值也是如此),或者它不满足“函数应返回两个数组中的整数数组"从作者的问题来看。@Larme你是对的,NSCountedSet
解决方案只返回1个元素,即使它在原始数组中出现过多次。但是,在我看来,如果两个数组中的一个有重复的元素,寻找非唯一的元素就没有意义了。至于第一个解决方案,我没有ge查找元素的逻辑,只更正了索引错误。
func nonUniqueElements(array1: [Int], array2: [Int])->[Int] {
let countedSet = NSCountedSet(array: array1+array2)
return countedSet.flatMap({ element in
if countedSet.count(for: element) > 1 {
return element as? Int
} else {
return nil
}
})
}
nonUniqueElements(array1: arrayOne, array2: arrayTwo)