如果缺少任何序列,如何拆分顺序整数数组

时间:2018-03-05 21:07:39

标签: arrays swift

Supposre我有一个整数输入数组。我想基于缺少的整数将此数组拆分为多个数组,并将其附加到新数组中。我认为split可以在这里使用,但不知道如何做到这一点。我只想要arrayFinal

myArray = [0,1,2,4,7,8]

所需输出

arrayOne = [0,1,2]
arrayTwo = [4]
arrayThree = [7,8]
arrayFinal = [[0,1,2], [4], [7,8]]

2 个答案:

答案 0 :(得分:1)

这是你要求的算法,因此有十几种不同的方法可以做到这一点。由于您将不得不遍历数组的内容以找到缺失的整数,因此我只需创建一个数组并随时将数字附加到它上,然后在遇到间隙时创建一个新数组。

您可能需要针对您可能遇到的任何特殊情况进行调整。 “这总是从0开始向正方向移动吗?”等

试试这个:

func splitByMissingInteger(array: [Int]) -> [[Int]]? {
    var arrayFinal :[[Int]] = [ [Int]() ]
    var i = 0
    for num in array{
        if arrayFinal[i].isEmpty || (arrayFinal[i].last == nil){
            arrayFinal[i].append(num)
        } else if num == (arrayFinal[i].last! + 1){
            arrayFinal[i].append(num)
        } else {
            i += 1
            arrayFinal.append([Int]())
            arrayFinal[i].append(num)
        }
    }
    return arrayFinal
}

答案 1 :(得分:0)

您可以对数组进行排序并按顺序迭代它们。检查元素减去1是否等于2D数组的最后一个元素,如果为true,则以其他方式附加带元素的新数组并增加子数组的索引:

extension Collection where Element == Int {
    func grouped() -> [[Element]] {
        let elements = Set(self).sorted()
        guard let first = elements.first else { return [] }
        var result = [[first]]
        var i = 0
        for element in elements.dropFirst() {
            if element-1 == result[i].last! {
                result[i].append(element)
            } else {
                result.append([element])
                i += 1
            }
        }
        return result
    }
}
let myArray =  [0,1,2,4,7,8]
let grouped = myArray.grouped()    // [[0, 1, 2], [4], [7, 8]]