2017-09-05 121 views
-2

我想在不使用高階函數的情況下比較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

爲什麼這個問題得到了downvoted ?? – a2b123

+0

'爲我在totalArray {如sortedArray [i + 1] == sortedArray [i] ...''sortedArray.count == totalArray.count',對不對?所以如果「我」是最後一個索引,你不能做'totalArray [i + 1]',也不''sortedArray [i + 1]',這就是爲什麼你會得到一個索引越界問題。此外,你的邏輯暗示'arrayOne'或arrayTwo'內沒有重複的值。 – Larme

回答

1

的問題是,你是通過這意味着i將達到totalArray最後一個索引,那麼您要訪問的totalArray所有元素迭代i+1 - sortedArray的第012個元素,其長度與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達到相同的使用高階函數(您的解決方案實際上並未使用高階函數)。

你只需要創建從陣列的組合的組計數,然後使用flatMapfilter其計數大於1和map結果到[Int]的元素。

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) 
+0

我知道我犯了一個愚蠢的錯誤。謝謝! – a2b123

+0

很高興我能幫到你。我也用更高級的函數更新了我的答案,看看。 –

+0

這兩個解決方案之間的時間複雜性是否存在差異 – a2b123