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 回复 分享
发布于 2024-01-25 09:25 黑龙江
巧了,昨天面试就这题,今天看到了
点赞 回复 分享
发布于 2024-01-19 15:54 浙江

相关推荐

Java大菜狗:纯纯招黑奴,一天还不到两百那么多要求,还不迟到早退,以为啥啊,给一点工资做一堆活,还以不拖欠员工工资为荣,这是什么值得骄傲的事情吗,纯纯***公司
点赞 评论 收藏
分享
Hakasee:我的简历和你的基本一样,上周去了上海,boss投了三百家, 三家线下面试 第一家没有做题,全是八股和项目,因为第一次面试不怎么熟练,挂了 第二家,给你几个题目(①css垂直居中文字,字体每两秒闪烁一下以及点击弹窗,②给你一个链接,实现可视化地图,③然后是八股,图片性能优化,以及对图片app有什么想法),45分钟内做完,然后老板面试) 第三家特别偏僻,有点阴森,到了之后让了一个工位给我,有四个题目,①格式化时间 年月日当前时间星期几② 正则表达式提取新闻文字,③在文本域输入文字生成选择题以及选项④生成商品排版还是什么来着 三家都是不超过50人的小公司 两家线上牛客笔试(卡伦特,七牛云,但是笔试不仅要考前端,还要考后端,算法,甚至数学题 我的建议是如果只做了这两个vue项目且不怎么熟练的情况下,先沉淀沉淀,把react学了,上海好的公司基本都是react查看图片
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务