go最大堆 實現頻率排序

pardon110發表於2020-12-05

用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 協議》,轉載必須註明作者和本文連結

相關文章