2017-07-26 35 views
0

我被提出這個問題,我需要在給定的數組(襪子)中找到匹配的數字並打印出在該數組內找到多少襪子。這裏是我的代碼:更改for-in循環內數組的大小

let numberOfSocks = 9 
let socksArray = [10, 20, 20, 10, 10, 30, 50, 10] 

func findSocks(numberOfSocks: Int, array: [Int]) { 

    var arr = array 
    var uniqueSocks = Array(Set(array)) 
    var matchedPairs = 0 
    var sockCounter = 0 

    for i in 0..<uniqueSocks.count { // After the search, remove the element at index 
     sockCounter = 0 
     for j in 0..<arr.count { 
      if uniqueSocks[i] == arr[j] { 
       sockCounter += 1 
       if sockCounter % 2 == 0 { 
        matchedPairs += 1 
        sockCounter = 0 
       } 
      }  
     } 
    } 
    print(matchedPairs) 
}  
findSocks(numberOfSocks: numberOfSocks, array: socksArray) 

首先,我已刪除了所有重複陣列中的所以它給了我一個獨特的名單襪子,我需要尋找。然而,我想通過刪除我已經搜索過的襪子來優化這個算法,我試過arr.remove(at:)但它給了我一個出界,我有一種感覺,arr.count未被正確更新。歡迎任何幫助,謝謝!

+0

它可能會幫助你:https://stackoverflow.com/questions/27624331/unique-values-of-array-in-swift –

+0

從集合中刪除元素,而循環通過它不是理想的。您可以用更好的時間複雜性嘗試不同的字典數據結構。 – Breek

回答

2

我認爲你是在解決問題,關注小細節而不是大局。你想要得到的本質上是一個字典,其中鍵是數組中的唯一值,值是這些值出現在數組中的次數。因此,與你的字典開始:

var counts = [Int : Int]() 

沒有必要爲您的arrnumberOfSocks變量。而不是後者,只需使用socksArray.count,這顯然將始終與陣列的真實大小同步。

現在循環穿過你的襪子。對於每個襪子值,請在counts字典中遞增其計數,或者如果它還不在字典中,請將其添加並計數爲1

for sock in socks { 
    if !counts.contains(sock) { 
     counts[sock] = 1 
    } else { 
     counts[sock] = counts[sock] + 1 
    } 
} 

有更簡潔的方式來做到這一點,但我認爲這是一個最簡單的閱讀。