在for-in循环中更改数组的大小

时间:2017-07-26 15:02:48

标签: arrays swift algorithm

我遇到了这个问题,我需要在给定的数组(socks)中找到匹配的数字,并打印出在该数组中找到多少个袜子。这是我的代码:

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没有正确更新。欢迎任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

我认为你是在思考问题,专注于细节,而不是大局。你最终想要的是一个字典,其中键是数组中的唯一值,值是这些值在数组中出现的次数。所以从你的字典开始:

aws s3 --profile mybucket1 cp s3://my-bucket1/directory1/ /path/to/local/directory/ --exclude "*" --include "*match-me*" --recursive

您无需var counts = [Int : Int]() arr个变量。而不是后者,只需使用numberOfSocks,它显然将始终与数组的真实大小同步。

现在循环你的袜子。对于每个sock值,在socksArray.count字典中增加其计数,或者如果它不在字典中,则添加它并将其计为counts

1

有更简洁的方法可以做到这一点,但我认为这是最容易阅读的方法。