topK算法——面试

题目:我现在有一个文件,把文件中出现单词频率最高的k个单词找出来,文件内容都是逗号分隔的单词

我用go语言写

abc.txt内容
"wang,jing,yu,shuai,ge,shuai,ge,j"

package main

import (
	"fmt"
	"io/ioutil"
	"sort"
	"strings"
)

func main() {
	contents, err := ioutil.ReadFile("D:\\test1\\topK\\abc.txt")
	if err != nil {
		fmt.Println("无法读取文件:", err)
		return
	} else {
		fmt.Printf("%s\n", contents)
	}
	k := 2
	words := strings.Split(string(contents), ",")
	// 存放map,频率
	pl := make(map[string]int, 0)
	for _, v := range words {
		pl[v]++
	}
	// 去重后数组
	qcWords := []string{}
	for k, _ := range pl {
		qcWords = append(qcWords, k)
	}
	sort.Slice(qcWords, func(i, j int) bool {
		return pl[qcWords[i]] > pl[qcWords[j]]
	})
	for i := 0; i < len(pl) && i < k; i++ {
		fmt.Printf("%v,%v", qcWords[i], pl[qcWords[i]])
	}
}

到此结束

考察点:

  • 打开文件的api
  • strings.Split
  • map 存储单词的频率
  • 再做一个数组存储字符串(去重后的,可以直接从map的k拿)
  • 最后对这个字符串排序,到了这里就有几个选择了,上方选择了sort.Slice函数,底层是快速排序
  • 最后输出即可

别的方案:

  • 利用堆排序,因为是求频率最高的k个单词,所以可以用大顶堆,但是之前百度的面试官告诉我应该用小顶堆,各位大佬知道为什么吗?
  • 或者你可以用其他排序方法

全部评论
求大值使用小顶堆,堆中最后保存结果
1
送花
回复
分享
发布于 01-25 09:25 黑龙江
巧了,昨天面试就这题,今天看到了
点赞
送花
回复
分享
发布于 01-19 15:54 浙江
滴滴
校招火热招聘中
官网直投

相关推荐

1 9 评论
分享
牛客网
牛客企业服务