我是Go的新手并做了一些练习。其中之一是按频率对数组中的数字进行排序,从大多数到最不频繁。
Example:
Input: [2, 2, 5, 7, 4, 4, 4, 7, 2]
Output: [2, 4, 7, 5]
请注意,[4, 2, 7, 5]
也是正确的,因为4和2具有相同的频率。
为此我将数组转换为值值映射,这里看起来像这样:[2:3][4:3][7:2][5:1]
(2和3的频率为3,7有频率2,...)
之后我想简单地遍历地图并输出值排序的键。为此,我使用以下代码,这显然不起作用。为什么?
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
请记住,这是一项练习。我非常肯定会有更好的方法来建立这样做。
答案 0 :(得分:1)
你的&#39; max&#39;变量用于跟踪到目前为止看到的最大频率。但是当你做&#39; max = k&#39;你正在分配一把钥匙。
您需要在单独的变量中跟踪与该频率相关的最大频率和密钥。
...
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++
...
答案 1 :(得分:1)
对于已排序的频率,请使用地图然后使用切片。例如,
package main
import (
"fmt"
"sort"
)
func main() {
Input := []int{2, 2, 5, 7, 4, 4, 4, 7, 2}
fmt.Println("Input: ", Input)
mFreq := make(map[int]int, len(Input))
for _, n := range Input {
mFreq[n]++
}
sFreq := make([][2]int, 0, len(mFreq))
for n, f := range mFreq {
sFreq = append(sFreq, [2]int{n, f})
}
sort.Slice(sFreq, func(i, j int) bool {
if sFreq[i][1] <= sFreq[j][1] {
if sFreq[i][1] < sFreq[j][1] {
return false
}
if sFreq[i][0] >= sFreq[j][0] {
return false
}
}
return true
},
)
Output := []int{2, 4, 7, 5}
fmt.Println("Output: ", Output)
fmt.Println("Frequencies:", sFreq)
}
游乐场:https://play.golang.org/p/8tiSksz3S76
输出:
Input: [2 2 5 7 4 4 4 7 2]
Output: [2 4 7 5]
Frequencies: [[2 3] [4 3] [7 2] [5 1]]