2017-07-26 127 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 
    } 
} 

有更简洁的方式来做到这一点,但我认为这是一个最简单的阅读。