Arrays 快速比较两个独立阵列的元素

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] {

我试图在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)

问题是,您正在迭代
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)