用go內建堆容器實現大根堆
題面
給定一個字串,請將字串裡的字元按照出現的頻率降序排列。
輸入:
"tree"
輸出:
"eert"
解釋:
‘e’出現兩次,’r’和’t’都只出現一次。
因此’e’必須出現在’r’和’t’之前。此外,”eetr”也是一個有效的答案。
大根堆
- 實現go 堆的
heap.Interface
介面 - 自定義依據重複次數實現最大堆排序規則
import (
"bytes"
"container/heap"
)
type ByteSliceHeap [][]byte
var _ heap.Interface = (*ByteSliceHeap)(nil)
func (h ByteSliceHeap) Len() int { return len(h) }
func (h ByteSliceHeap) Less(i, j int) bool { return len(h[i]) > len(h[j]) }
func (h ByteSliceHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *ByteSliceHeap) Push(x interface{}) {
*h = append(*h, x.([]byte))
}
func (h *ByteSliceHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
func frequencySort(s string) string {
m := make(map[byte][]byte, 0)
for i := 0; i < len(s); i++ {
if _, ok := m[s[i]]; !ok {
m[s[i]] = []byte{s[i]}
} else {
m[s[i]] = append(m[s[i]], s[i])
}
}
h := &ByteSliceHeap{}
for _, v := range m {
heap.Push(h, v)
}
buf := &bytes.Buffer{}
for h.Len() > 0 {
buf.Write(heap.Pop(h).([]byte))
}
return buf.String()
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結