我正在尝试找到以下给定频率最高的元素。
首先,我正在尝试构建字典并根据频率对每个元素进行计数。
我被困在如何从构造的字典中提取最大值。
输入:[3,2,3]
输出:3
func majorityElement(_ nums1: [Int]) -> Int {
var num1Dict = Dictionary(nums1.map{ ($0, 1) }, uniquingKeysWith : +)
return num1Dict.values.max() // ????
}
答案 0 :(得分:1)
您已经正确构造了games(){
var selectAllGames = [
{'gametitle': 'All Games', gid: null}
]
return selectAllGames.concat(this.$store.getters.games);
}
,对于输入num1Dict
来说应该是这样的:
[3,2,3]
[2:1, 3:2]
将返回2,因为在字典(1和2)的所有值中,2是最高的。
现在看到您的错误了吗?
您需要返回与最大值(而不是最大值)关联的键。
一种非常简单的方法是这样做:
values.max()
答案 1 :(得分:1)
您可以使用reduce(into:)
来生成包含元素及其频率的Dictionary
,然后使用这些频率对数组进行排序,然后简单地返回已排序数组的最后一个元素(基于升序)
extension Array where Element: Comparable & Hashable {
func sortByNumberOfOccurences() -> [Element] {
let occurencesDict = self.reduce(into: [Element:Int](), { currentResult, element in
currentResult[element, default: 0] += 1
})
return self.sorted(by: { current, next in occurencesDict[current]! < occurencesDict[next]!})
}
func elementWithHighestFrequency() -> Element? {
return sortByNumberOfOccurences().last
}
}
免责声明:sortByNumberOfOccurences
方法是从another answer of mine复制而来的。
答案 2 :(得分:0)
您要查找的数学名称(集合中最常见的元素)称为 mode 。可能存在联系(例如[1, 1, 2, 2, 3, 3]
具有3种模式:[1, 2, 3]
)
如果要使用任何一种模式(特别是不关心哪种模式),则可以使用Dictionary.max(by:)
,该模式可用于查找计数最高的(元素,计数)对(即字典值)。然后,您可以获得这对钥匙,即模式元素。
extension Sequence where Element: Hashable {
func countOccurrences() -> [Element: Int] {
return self.reduce(into: [:]) { (occurences, element) in occurences[element, default: 0] += 1}
}
func mode() -> Element? {
return self.countOccurrences()
.max(by: { $0.value < $1.value })?
.key
}
func modes() -> [Element] {
var firstModeNumOccurences: Int? = nil
let modes = countOccurrences()
.sorted { pairA, pairB in pairA.value > pairB.value } // sorting in descending order of num occurences
.lazy
.prefix(while:) { (_, numOccurences) in
if firstModeNumOccurences == nil { firstModeNumOccurences = numOccurences }
return numOccurences == firstModeNumOccurences
}
.map { (element, _) in element }
return Array(modes)
}
}
print([1, 2, 3, 3, 4, 4].mode() as Any) // => 3 or 4, non-deterministic
print([1, 2, 3, 3, 4, 4].modes() as Any) // => [3, 4]