Skip to content

词频统计 ​

难度:⭐ 基础 ​

考点 ​

  • map 基本 CRUD 操作
  • 字符串分割处理
  • map 排序输出

题目描述 ​

函数1:WordCount ​

统计文本中每个单词出现的次数。单词以空格分隔,需要转为小写后统计。

函数2:TopN ​

从词频 map 中找出出现次数最多的 N 个单词。 如果出现次数相同,按字母顺序排列。

函数3:UniqueWords ​

返回文本中只出现一次的单词列表(按字母顺序)。

函数签名 ​

go
func WordCount(text string) map[string]int
func TopN(freq map[string]int, n int) []string
func UniqueWords(text string) []string

提示 ​

  1. strings.Fields 按空白字符分割
  2. strings.ToLower 转小写
  3. 排序可以用 sort.Slice

参考答案(Go) ​

点击展开参考答案
go
//go:build ignore

package answer

import (
	"sort"
	"strings"
)

func WordCount(text string) map[string]int {
	result := make(map[string]int)
	for _, word := range strings.Fields(text) {
		result[strings.ToLower(word)]++
	}
	return result
}

func TopN(freq map[string]int, n int) []string {
	if n <= 0 {
		return []string{}
	}

	words := make([]string, 0, len(freq))
	for w := range freq {
		words = append(words, w)
	}

	sort.Slice(words, func(i, j int) bool {
		if freq[words[i]] != freq[words[j]] {
			return freq[words[i]] > freq[words[j]]
		}
		return words[i] < words[j]
	})

	if n > len(words) {
		n = len(words)
	}
	return words[:n]
}

func UniqueWords(text string) []string {
	freq := WordCount(text)
	var result []string
	for word, count := range freq {
		if count == 1 {
			result = append(result, word)
		}
	}
	sort.Strings(result)
	if result == nil {
		return []string{}
	}
	return result
}

持续学习,持续构建。