如何在Swift 4中计算数组的所有众数?
解决多众数返回问题的Swift实现
我来帮你搞定这个问题!你的当前代码确实只能追踪出现次数最多的单个元素,当数组里有多个出现次数相同的众数时,就会漏掉其他的。比如数组[1,2,2,3,3],原代码只会返回2或者3中的一个,而正确的结果应该同时返回这两个数。
原代码的问题分析
原代码里的highestKeyPair变量只保存了一组键值对,遍历统计结果时,只会在遇到出现次数更大的元素时更新它。如果遇到出现次数和当前最大值相同的元素,代码会直接跳过,导致最终只能返回一个众数。
改进后的实现方案
我们可以调整思路:先统计所有元素的出现次数,找到最大的出现次数后,再把所有出现次数等于这个最大值的元素都收集起来。这样就能返回所有众数了:
func findModes() -> [Float] { // 统计每个数字的出现次数,用default简化判断逻辑 var occurrences: [Int: Int] = [:] for number in array { occurrences[number, default: 0] += 1 } // 处理空数组的边界情况 guard let maxOccurrenceCount = occurrences.values.max() else { return [] } // 筛选出所有出现次数等于最大值的数字,并转换为Float类型 let modes = occurrences.filter { $0.value == maxOccurrenceCount } .map { Float($0.key) } return modes }
关键改进点
- 简化统计逻辑:用
occurrences[number, default: 0] += 1替代了原有的if-else判断,代码更简洁易读。 - 支持多众数返回:将返回类型从单个
Float改为[Float],这样可以一次性返回所有符合条件的众数。 - 处理边界情况:当输入数组为空时,返回空数组,避免原代码返回错误的0.0结果。
比如调用这个函数处理数组[4,4,5,5,6],会返回[4.0,5.0],完全符合预期。
内容的提问来源于stack exchange,提问作者Saved Files
相关产品推荐
相关产品推荐

