首页 > 解决方案 > 在 int swift 的数组上找到最大的三个数字

问题描述

我试图在 int 数组中找到最大的三个数字,但我的算法返回错误的结果

输入和输出最大三个数字([141, 1, 17, -7, -17, -27, 18, 541, 8, 7, 7])

结果 [141, 1, 17, 18, 541] 预期 [141, 18, 541]

func largestthreeNumbers(_ array:[Int]) ->[Int]{
        var first = 0
        var second = 0
        var thrid = 0
        var result = [Int]()
        if array.count < 3 {
            print("Invalid Input")
            return result
        }
        
        for i in 0 ..< array.count {
            if array[i] > first{
                thrid = second
                second = first
                first = array[i]
                result.append(first)
               
            }
            else if(array[i] > second){
                thrid = second
                second = array[i]
                result.append(second)
               
                
            }
            else if (array[i] > thrid){
                thrid = array[i]
                result.append(thrid)
           
            }
        }
        
        return result
    }

标签: swiftalgorithm

解决方案


如果您需要保留元素的顺序,您可以按其值对集合元素索引进行排序,获取最高元素的最后 3 个索引,对它们进行排序并映射相应的元素:

let numbers = [141, 1, 17, -7, -17, -27, 18, 541, 8, 7, 7]

let largestNumbers = numbers
    .indices
    .sorted { numbers[$0]<numbers[$1] }
    .suffix(3)
    .sorted()
    .map{ numbers[$0] }  // [141, 18, 541]

如果结果顺序不重要您可以简单地按降序对元素进行排序并获取前 n 个元素:

let largestNumbers = numbers.sorted(by: >).prefix(3)   // [541, 141, 18]

如果您正在处理一个大型集合,您可以在 GitHub 上查看 Apple 的 swift-algorithms 中的SortedPrefix算法,正如这篇 SO 帖子中提到的如何获取 Swift 字典中的前 3 个最大值


推荐阅读