面试题答案
一键面试package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
type WordCount struct {
word string
count int
}
func main() {
file, err := os.Open("large_text_file.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
wordCountMap := make(map[string]int)
for scanner.Scan() {
words := strings.Fields(scanner.Text())
for _, word := range words {
wordCountMap[word]++
}
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading file:", err)
return
}
var wordCounts []WordCount
for word, count := range wordCountMap {
wordCounts = append(wordCounts, WordCount{word, count})
}
sort.Slice(wordCounts, func(i, j int) bool {
return wordCounts[i].count > wordCounts[j].count
})
for i := 0; i < len(wordCounts) && i < 10; i++ {
fmt.Printf("Word: %s, Count: %d\n", wordCounts[i].word, wordCounts[i].count)
}
}
关键部分设计思路
-
文件读取:
- 使用
os.Open
打开文件,并使用defer
确保文件在函数结束时关闭。 - 使用
bufio.NewScanner
逐行读取文件内容,这样可以有效减少内存占用,避免一次性将整个大文件读入内存。
- 使用
-
单词统计:
- 使用
strings.Fields
函数将每行文本按空格分割成单词。 - 使用一个
map[string]int
来统计每个单词出现的次数,map
的查找和插入操作平均时间复杂度为O(1),适合高效统计单词。
- 使用
-
排序和输出:
- 将
map
中的键值对转换为WordCount
结构体切片,以便进行排序。 - 使用
sort.Slice
对WordCount
切片按出现次数从高到低排序。 - 最后输出前10个单词及其出现次数。
- 将