MST

星途 面试题库

面试题:Go语言strings包性能优化及复杂文本处理

给定一个非常大的文本文件(假设内容为纯字符串且无特殊字符编码问题),需要对其进行如下处理:统计每个单词(单词由空格分隔)出现的次数,并按照出现次数从高到低排序输出前10个单词及其出现次数。要求使用Go语言的strings包高效实现,同时要考虑内存占用和性能优化。请给出完整的实现代码,并解释关键部分的设计思路。
41.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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)
    }
}

关键部分设计思路

  1. 文件读取

    • 使用os.Open打开文件,并使用defer确保文件在函数结束时关闭。
    • 使用bufio.NewScanner逐行读取文件内容,这样可以有效减少内存占用,避免一次性将整个大文件读入内存。
  2. 单词统计

    • 使用strings.Fields函数将每行文本按空格分割成单词。
    • 使用一个map[string]int来统计每个单词出现的次数,map的查找和插入操作平均时间复杂度为O(1),适合高效统计单词。
  3. 排序和输出

    • map中的键值对转换为WordCount结构体切片,以便进行排序。
    • 使用sort.SliceWordCount切片按出现次数从高到低排序。
    • 最后输出前10个单词及其出现次数。