【LeetCode】692. 前K个高频单词
692. 前K个高频单词
- 描述
- 示例
- 解题思路及事项
- 思路一
- 思路二
描述
给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序
示例
示例1
输入: words = [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
示例2
输入: [“the”, “day”, “is”, “sunny”, “the”, “the”, “the”, “sunny”, “is”, “is”], k = 4
输出: [“the”, “is”, “sunny”, “day”]
解析: “the”, “is”, “sunny” 和 “day” 是出现次数最多的四个单词,出现次数依次为 4, 3, 2 和 1 次。
解题思路及事项
思路一
遇到这样的题,我们一般思路肯定就是TOP-K问题,这样想当然没有问题,但是我们这里数据没那么多,用到这里属于杀鸡焉用牛刀,不过我们可以试一试,等下在讲别的思路。
不管是那个思路,首先这是一对一的关系,我们肯定要先用到map,,统计不同字符串出现的次数。
TOP-K在于建大堆和小堆的问题,这道题建议建大堆。我们现在已经学了,C++,因此可以使用priority_queue它默认就是建大堆,

然后把前K个元素拿出来就好了
class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> mp;for(auto& str:words){mp[str]++;}vector<string> ret;//这里我们建一个大堆priority_queue<pair<string,int>>> py;auto it=mp.begin();while(it != mp.end()){py.push(*it);++it;}while(k--){ret.push_back(py.top().first);py.pop();}return ret;}
};
这是根据我们的思路写出来的代码

但是结果不对,难道我们思路出现了问题,这道题不应该这样解,
其实并不是,这样的思路是对的,但是问题就在于priority_queue第三个参数仿函数的比较出现了问题。
因为它比较的是pair对象。而pair的相关比较函数我们可以看看到底是怎么比的

可以看到pair是先比较first,如果first相等在比较second。
但是我们的pair第一个参数是string,第二个参数是int。
这于我们想要优先比较int就不对,因此我们自己写一个仿函数。
class Solution {
public:template<class T>struct Less{bool operator()(const pair<string,int>& l,const pair<string,int>& r){return l.second < r.second;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> mp;for(auto& str:words){mp[str]++;}vector<string> ret;//这里我们建一个大堆priority_queue<pair<string,int>,vector<pair<string,int>>,Less<pair<string,int>>> py;auto it=mp.begin();while(it != mp.end()){py.push(*it);++it;}while(k--){ret.push_back(py.top().first);py.pop();}return ret;}
};

运行结果还是出现了问题。经过分析可能是建大堆出现了问题,我们打印一下看看是不是这个问题。

经过对比发现,它们出现次数都是6次,就是建立大堆谁在上面谁在下面出现了问题。
注意看到我们的题目要求,不同单词出现相同频率,按 字典顺序 排序

而我们在写自己的仿函数的时候,只考虑了出现次数不同的情况,而没有考虑这个情况。
class Solution {
public:template<class T>struct Less{bool operator()(const pair<string,int>& l,const pair<string,int>& r){//出现次数相同,就按 字典顺序 排序return l.second < r.second || (l.second == r.second && l.first > r.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> mp;for(auto& str:words){mp[str]++;}// for(auto& e: mp)// {// cout<<e.first<<":"<<e.second<<endl;// }vector<string> ret;//这里我们建一个大堆priority_queue<pair<string,int>,vector<pair<string,int>>,Less<pair<string,int>>> py;auto it=mp.begin();while(it != mp.end()){py.push(*it);++it;}while(k--){ret.push_back(py.top().first);py.pop();}return ret; }
};
思路二
刚才说过使用堆来对少的数据排序,杀鸡焉用牛刀了。现在想一想我用map建立一对一的关系之后,我给它排序一下不就好了吗,反正有算法库给我提供的sort函数。那来试一试
注意sort底层使用的快速排序,结构是线性结构,而map并不是线性结构而是树形结构,因此要把map里的数据放在vector,才能使用sort。
sort默认是升序,第一个版本是按照operator<比较的,第二个是按照comp比较的也就是说我们给它提供一个仿函数按照自己的想法比较。

由TOP-K我们就知道如果直接让pair对比会有问题,所以我们选第二种。
class Solution {
public:struct Compare{bool operator()(const pair<string,int>& l,const pair<string,int>& r){return l.second > r.second || (l.second == r.second && l.first < r.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> mp;for(auto& str:words){mp[str]++;}vector<string> ret;vector<pair<string,int>> v;for(auto& e:mp){v.push_back(e);}//这个Compare我们是按照降序进行判断的sort(v.begin(),v.end(),Compare());for(int i=0;i<k;++i){ret.push_back(v[i].first);}return ret;}
};
这样也能解决问题,不过这样的sort并不能保持稳定性,需要我自己手动控制才能保持稳定性以达到相同次数按 字典顺序 排序。
下面介绍一种稳定的排序算法。

stable_sort,可以保持排序的稳定性。

i 在 love的前面,出现次数相同,i 依旧在 love前面。
class Solution {
public:struct Compare{bool operator()(const pair<string,int>& l,const pair<string,int>& r){return l.second > r.second ;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> mp;for(auto& str:words){mp[str]++;}vector<string> ret;vector<pair<string,int>> v;for(auto& e:mp){v.push_back(e);}//这个Compare我们是按照降序进行判断的//sort(v.begin(),v.end(),Compare());stable_sort(v.begin(),v.end(),Compare());for(int i=0;i<k;++i){ret.push_back(v[i].first);}return ret;}
};
相关文章:
【LeetCode】692. 前K个高频单词
692. 前K个高频单词 描述示例解题思路及事项思路一思路二 描述 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序 示例 示例1 输…...
在Windows操作系统上使用rtsp simple server和ffmpeg推送录屏视频流
大纲 1 搭建启动rtsp server2 推送录屏视频流下载FFmpeg 3 检验3.1 获取本机IP3.2 检测 1 搭建启动rtsp server 从https://github.com/aler9/rtsp-simple-server/releases下载Windows版本的编译结果。 解压,然后启动该程序 2 推送录屏视频流 下载FFmpeg 从htt…...
互联网摸鱼日报(2023-12-05)
互联网摸鱼日报(2023-12-05) 36氪新闻 魔珐科技创始人兼CEO柴金祥:3D虚拟人原生产品,正在押注时代的“最大红利”| WISE2023商业之王大会 上市就来割韭菜?数十家在审企业也有“掏空式分红”之嫌,此前多家企业已惹众怒 历史新高…...
Android 项目的依赖方式
四种依赖方式 在 Android 项目中,有多种方式可以添加项目依赖。以下是几种常见的方式: Gradle 依赖:这是最常用和推荐的方式。在项目的 build.gradle 文件中,你可以使用 dependencies 块来添加依赖项。Gradle 会自动从远程仓库下…...
ArcGIS提取DEM中的山脉范围
已知数据:DEM文件ASTGTM_N00E118E.img 使用软件:ArcMap 要求:对数据进行操作,提取数据文件中的山脉范围 下面开始操作: 1、 打开ArcMap将DEM文件ASTGTM_N00E118E.img添加到数据框。 2、 接下来我们打开spatial ana…...
漏洞复现--万户ezoffice wpsservlet任意文件上传
免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…...
TCPDUMP抓包明确显示IP地址和端口号
经常使用tcpdump进行抓包的同学可以忽略了,这篇偏于使用扫盲;首先,tcpdump抓包目的IP显示为hostname,如果端口是知名端口,显示为协议名而不是端口号。这种默认其实略有问题的: 如果我们使用默认的hostname…...
java FTP客户端获取文件流假死问题
依赖 hutool FTP配置 inspection.data.ftp.host172.26.1.41 inspection.data.ftp.port21 inspection.data.ftp.user6c inspection.data.ftp.password6cqq123 inspection.data.ftp.charsetNameGBK FTP配置类 import lombok.Data; import org.springframework.boot.context.pr…...
python使用记录
1、VSCode添加多个python解释器 只需要将对应的python.exe的目录,添加到系统环境变量的Path中即可,VSCode会自动识别及添加 2、pip 使用 pip常用命令和一些坑 查看已安装库的版本号 pip show 库名称 通过git 仓库安装第三方库 pip install git仓库地…...
【Vulnhub 靶场】【Coffee Addicts: 1】【简单-中等】【20210520】
1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/coffee-addicts-1,699/ 靶场下载:https://download.vulnhub.com/coffeeaddicts/coffeeaddicts.ova 靶场难度:简单 - 中等 发布日期:2021年5月20日 文件大小:1.3 …...
codeforces每日两道思维题(第 二 天)
第二天 1 B. Same Parity Summands 原题链接:Problem - 1352B - Codeforces rating : 1200 题目描述: 给定两个正整数 n(1≤n≤10^9)和 k(1≤k≤100)。将数字 n 表示为 k 个相同奇偶性的正整数之和&…...
【网络安全】-常见的网站攻击方式详解
文章目录 介绍1. SQL 注入攻击攻击原理攻击目的防范措施 2. 跨站脚本攻击(XSS)攻击原理攻击目的防范措施 3. CSRF 攻击攻击原理攻击目的防范措施 4. 文件上传漏洞攻击原理攻击目的防范措施 5. 点击劫持攻击原理攻击目的防范措施 结论 介绍 在数字时代&a…...
ElasticSearch学习笔记(一)
计算机软件的学习,最重要的是举一反三,只要大胆尝试,认真验证自己的想法就能收到事办功倍的效果。在开始之前可以看看别人的教程做个快速的入门,然后去官方网站看看官方的教程,有中文教程固然是好,没有中文…...
go写文件后出现大量NUL字符问题记录
目录 背景 看看修改前 修改后 原因 背景 写文件完成后发现: size明显也和正常的不相等。 看看修改前 buf : make([]byte, 64) buffer : bytes.NewBuffer(buf)// ...其它逻辑使得buffer有值// 打开即将要写入的文件,不存在则创建 f, err : os.Open…...
【Collection - PriorityQueue源码解析】
本文主要对Collection - PriorityQueue进行源码解析。 Collection - PriorityQueue源码解析 概述方法剖析 add()和offer()element()和peek()remove()和poll()remove(Object o) 概述 前面以Java ArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做Priori…...
Javascript_根据截止日期超时自动返回
例如定时交卷功能,隐藏一个input id"endTime"存放超时时间,例如2023-12-01 20:56:15,使用如下代码即可实现超时自动处理。 <script src"/jquery.min.js"></script><script type"text/javascript&qu…...
记录 | vscode设置自动换行
右上菜单栏 -> 查看 -> 打开自动换行 或者还有种方式,如下, 左下角小齿轮,点击设置 然后输入 Editor: Word Wrap ,把开关打开为 on...
k8s引用环境变量
一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充: k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注: configMapKeyRef、fieldRef 和 resour…...
navicate16 2059 plugin http could not be loaded
plugin http could not be loaded 乱码 library path http.dll 今天新装一台机子的navicate遇到这个问题。 查了半天都是说 caching_sha2_password’的解决办法。 然后是咋解决的呢,真是丢脸 由于我是直接从浏览器复制下来的ip,所以虽然我只复制了ip地…...
dp-基础版动态规划(动态规划每日一题计划)10/50
最小路径和 class Solution {public static int minPathSum(int[][] grid) {int dp[][]new int[grid.length][grid[0].length];dp[0][0]grid[0][0];for(int i1;i<grid[0].length;i){dp[0][i]grid[0][i]dp[0][i-1];}for(int i1;i<grid.length;i){dp[i][0]grid[i][0]dp[i-…...
网络虚拟化如何应对100G性能挑战:从SDN/NFV到DPDK与智能网卡的演进
1. 网络虚拟化与100G浪潮:一场正在发生的架构革命如果你在2015年前后从事网络或云计算相关的工作,大概会对一个词印象深刻:100G。当时,行业媒体和厂商都在热烈讨论一个预测——到2018年,100G将成为网络设备,…...
污水处理通气帽标准尺寸参数与国标通气帽定制要点
在好些个工程现场当中,人们往往会忽略掉一个看起来平常但是特别要害的小部件——通气帽。特别是在污水处理的体系当中,它承担平衡内部和外部的气压,阻止异味向外溢出,阻拦异物进入等好几个方面的功能。要是选择类型不适合…...
5 月 8 日 AIoT 双标落地,中国智能基础设施建设开启十年竞速!
AIoT 产业里程碑:5 月 8 日双标落地2026 年 5 月 8 日,注定会被写进中国 AIoT 产业的发展史。多个国家级部委在同一天落下两枚关乎未来十年的战略锚点。第一枚,是国家网信办、国家发展改革委、工业和信息化部联合印发的 《智能体规范应用与创…...
Applite:Mac软件管理的图形化革命,告别命令行操作
Applite:Mac软件管理的图形化革命,告别命令行操作 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为Mac软件安装更新而烦恼吗?Applite作…...
Gemini插件无法访问本地PDF/网页源码?手把手教你绕过Chrome沙箱限制(含Manifest V3兼容性补丁代码)
更多请点击: https://intelliparadigm.com 第一章:Gemini插件本地资源访问受限的本质原因 沙箱隔离机制的强制约束 Gemini 插件运行于 Chromium 扩展沙箱环境中,该环境默认禁用所有 Node.js API(如 fs、 child_process…...
百度网盘Mac版加速插件:突破下载限制的实用方案
百度网盘Mac版加速插件:突破下载限制的实用方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 对于经常使用百度网盘的Mac用户来说&#x…...
SAP物料主数据维护时,计量单位从Z变成ZA?一文搞懂CUNI配置与转换例程
SAP计量单位转换机制深度解析:从Z到ZA的幕后逻辑 引言 在SAP系统中维护物料主数据时,许多用户都曾遇到过这样的困惑:明明在MM02事务中输入的计量单位是"Z",保存后查询数据库却发现变成了"ZA"。这种现象并非系…...
从入门到精通:Python开发在Web后端的实战应用
在当今快速发展的互联网时代,Web后端开发作为连接前端界面与数据库的核心,其重要性不言而喻。Python,凭借其简洁的语法、强大的库支持以及活跃的社区,已成为Web后端开发的热门选择。本文将带你从零开始,逐步掌握Python…...
大模型令牌管理工具tokscale:统一计数与成本估算的插件化实践
1. 项目概述:一个面向现代开发者的轻量级令牌管理工具 最近在折腾一些需要处理大量文本数据的项目,比如自动化文档摘要、代码生成或者API调用,一个绕不开的问题就是“令牌”(Token)的管理。无论是使用OpenAI的GPT系列模…...
别再死记硬背了!用Wireshark抓包实战,5分钟搞懂IP报文每个字段
用Wireshark解密IP协议:从抓包实战到网络诊断的完全指南 当你第一次打开网络教材看到IP报文那密密麻麻的字段时,是否感觉像在解读外星密码?传统的学习方法让我们死记硬背"版本号4位、首部长度4位、服务类型8位...",但今…...
