我是围棋新手,正在做一些练习。其中之一是按频率从最频繁到最不频繁对数组中的数字进行排序。
Example:
Input: [2, 2, 5, 7, 4, 4, 4, 7, 2]
Output: [2, 4, 7, 5]
请注意 [4, 2, 7, 5]
也是正确的,因为 4 和 2 具有相同的频率。
为此,我将数组转换成一个value value 映射,这里看起来像这样:[2:3][4:3][7:2][ 5:1]
(2 和 3 的频率为 3,7 的频率为 2,...)
之后我想简单地遍历 map 并输出按值排序的键。为此,我使用了以下代码,这显然不起作用。为什么?
count := 0
max := -1
// break loop, if map is empty
for i := 0; i < 1; i-- {
if len(m) == 0 {
break
}
max = -1
// get key of biggest value
for k, v := range m {
if v > max {
max = k
}
}
// res (for result) is a slice of integers
res[count] = max
// remove key-value-pair from map
delete(m, max)
count++
}
return res
请记住这是一个练习。我非常确定有更好的方法可以做到这一点。
最佳答案
您的“最大”变量旨在跟踪目前看到的最大频率。但是,当您执行“max = k”时,您正在分配一个键。
您需要在单独的变量中跟踪最大频率和与该频率关联的键。
...
for k, v := range m {
if v > maxFreq {
maxFreq = v
mostFrequentKey = k
}
}
// res (for result) is a slice of integers
res[count] = mostFrequentKey
// remove key-value-pair from map
delete(m, mostFrequentKey)
count++
...
关于sorting - 在 Golang 中使用 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49058063/