C++ 前K个高频单词的六种解法

目录

 大堆

小堆

vector+sort

 vector+stable_sort

multimap

set/multiset

与GPT的对话

1.对于比较类型中 < 运算符重载的理解

2.map有稳定性的说法吗

​编辑

3.为什么map和set类的仿函数后面要加const来修饰*this

5.关于名词的理解

6.匿名对象对类要求

7.map和set的基本知识


 

分析:其实就是选择一种容器排序,需要能够存放一对元素,可以想到使用map,unordered_map,vector,pair

堆:

        个人理解:比较的时候左边是parent,右边是child,所以当仿函数是小于号时候,也就是孩子大,接下来进行交换,大的自然往就上走;对于一般的线性结构小于升序,大于降序,我觉得是这样的nums[right]<nums[left]

 大堆

 可以建大堆,也可以小堆

1.大堆,就是大的在根,这样的话就不能建立一个大小为K的堆,只能全部梭哈

2. 比较逻辑是根据题意来的,个数优先,其次在个数相同的时是字典序,所以肯定有个或(“ | | ”)

class Solution {
public:typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& kv1, const PSI& kv2){return kv1.second < kv2.second || kv1.second == kv2.second && kv1.first > kv2.first;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> m;for(auto& e : words)m[e]++;priority_queue<PSI, vector<PSI>, cmp> heap(m.begin(), m.end());vector<string> ret;for(int i = 0; i < k; i++)ret.push_back(heap.top().first), heap.pop();return ret;}
};

小堆

 1.如果堆里的K个元素就是符合条件的,那么只能小根堆;遇到新的元素先push进来,如果size() > K那么就pop()

2.在输出方面:因为只能取出堆顶元素,如果选择正着存,可以使用ret.push_back() + reverse

如果是想一步到位那么就放到对应的下标里,注意:需要提前开空间初始化(也就是赋值),因为单单开空间是不能使用下标来访问元素(其实是很有道理的,没有初始化这个数据就是不属于你,就是不应该有访问权限,可是我是修改这个位置的值,不是访问啊;修改的前提是有访问的权限,有访问权限才有修改资格),可以使用resize或者创建对象的时候就初始化

 3.cmp与大堆相反

class Solution {
public:typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& kv1, const PSI& kv2){return kv1.second > kv2.second || kv1.second == kv2.second && kv1.first < kv2.first;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> m;for(auto& e : words)m[e]++;priority_queue<PSI, vector<PSI>, cmp> heap;for(auto& e : m){heap.push(e);if(heap.size() > k) heap.pop();}// vector<string> ret(k);// for(int i = k - 1; i >= 0; i--)//     ret[i] = heap.top().first, heap.pop();vector<string> ret;for(int i = 0; i < k; i++)ret.push_back(heap.top().first), heap.pop();reverse(ret.begin(), ret.end());return ret;}
};

vector+sort

class Solution {
public:typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& kv1, const PSI& kv2) {return kv1.second > kv2.second || kv1.second == kv2.second&& kv1.first < kv2.first;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> count_map;for(auto& v : words)count_map[v]++;vector<pair<string, int>> v(count_map.begin(), count_map.end());sort(v.begin(), v.end(), cmp());vector<string> ret;for(int i = 0; i < k; i++)ret.push_back(v[i].first);return ret;}
};

 vector+stable_sort

稳定性指的是元素在原始序列中的相对顺序,这里不需要写个数相同情况下字典序的比较,是因为map默认就是less<key>,如果掉默认的greater(),那么遇到比较时传的是pair的运算符重载

class Solution {
public:typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& kv1, const PSI& kv2) {return kv1.second > kv2.second;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> count_map;for(auto& v : words)count_map[v]++;vector<pair<string, int>> v(count_map.begin(), count_map.end());stable_sort(v.begin(), v.end(), cmp());vector<string> ret;for(int i = 0; i < k; i++)ret.push_back(v[i].first);return ret;}
};

multimap

1. 不熟练->写出这样的map<pair<string, int>, cmp>类型,导致下面push_back报错(没有匹配的函数),那么也就不能用map的迭代器了,类型不配了

2. 

cmp传的参数只能是第一次参数,所以int必须在string前面,那么为什么保证了字典序?我觉得是因为第一个map

问题:会发现仿函数后面有const,前面的容器为什么不需要?map和set就要?

class Solution {
public:typedef pair<string, int> PSI;struct cmp{bool operator()(const int key1, const int key2) const{return key1 > key2;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> count_map;for(auto& str : words)count_map[str]++;// map<pair<string, int>, cmp> sort_map(count_map.begin(), count_map.end());// multimap<string, int, cmp> sort_map(count_map.begin(), count_map.end());// multimap<int, string, cmp> sort_map(count_map.begin(), count_map.end());multimap<int, string, cmp> sort_map;for(auto& e : count_map)sort_map.insert({e.second, e.first});// sort_map.insert(make_pair(e.second, e.first));vector<string> ret;auto it = sort_map.begin();for(int i = 0; i < k; i++){ret.push_back(it->second);it++;}return ret;}
};

set/multiset

map和set的取值只能通过迭代器

这个地方的multiset和set效果是一样的,因为每一pair都是不一样的

class Solution {
public:typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& kv1, const PSI& kv2) const{return kv1.second > kv2.second || kv1.second == kv2.second && kv1.first < kv2.first;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> count_map;for(auto& str : words)count_map[str]++;set<PSI, cmp> sort_set(count_map.begin(), count_map.end());//multiset<PSI, cmp> sort_set(count_map.begin(), count_map.end());vector<string> ret;auto it = sort_set.begin();for(int i = 0; i < k; i++){ret.push_back(it->first);it++;}return ret;}
};

与GPT的对话

1.对于比较类型中 < 运算符重载的理解

升序是less,重载的是 < (小于号)

2.map有稳定性的说法吗

3.为什么map和set类的仿函数后面要加const来修饰*this

我没怎么看懂,以现在的功力只能记住map和set中的比较类型的()运算符重载的成员函数,需要加上const

5.关于名词的理解

6.匿名对象对类要求

7.map和set的基本知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手使用GIT上传本地项目到Github(个人笔记)

亲测下面的文章很有用处。 1. 初次使用git上传代码到github远程仓库 - 知乎 (zhihu.com) 2. 使用Git时出现refusing to merge unrelated histories的解决办法 - 知乎

【大数据存储】实验五:Mapreduce

实验Mapreduce实例——排序&#xff08;补充程序&#xff09; 实验环境 Linux Ubuntu 16.04 jdk-8u191-linux-x64 hadoop-3.0.0 hadoop-eclipse-plugin-2.7.3.jar eclipse-java-juno-SR2-linux-gtk-x86_64 实验内容 在电商网站上&#xff0c;当我们进入某电商页面里浏览…

windows@软件显示模糊@屏幕显示器分辨率和精细度

文章目录 refsDPIPPIPPI (Pixels Per Inch)DPI (Dots Per Inch) 屏幕尺寸数windows中DPI设置对单个应用设置DPI兼容性设置使用系统全局设置 获取屏幕(监视器)信息&#x1f47a;获取监视器的型号pnp 监视器windows 获取屏幕分辨率 高分辨率屏幕高分辨率和高精细度屏幕&#x1f4…

RedHat9中KVM虚拟机的配置与管理

KVM虚拟技术介绍 Linux的KVM&#xff08;Kernel-based Virtual Machine&#xff09;虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机&#xff0c;每个虚拟机都有自己的操作系统和应用程序&#xff0c;就像运行在独立的物理…

MyBatis入门到掌握(JAVA)

建立连接可能涉及到的问题&#xff08;只需要自己改一下就行&#xff09; 1、MyBatis是⼀款优秀的 持久层 框架&#xff0c;⽤于简化JDBC的开发 2、数据库连接配置 &#xff08;1&#xff09;yml配置 # 数据库连接配置 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/…

OAuth2-03-springboot 整合

拓展阅读 OAuth 2.0-01-Overview OAuth2-02-java 整合 OAuth2-03-springboot 整合 序言 安全性是暴露由许多微服务组成的公共访问API时要考虑的最重要的一个方面。 Spring有一些有趣的功能和框架&#xff0c;使我们的微服务安全配置更容易。 在本文中&#xff0c;我将向…

基于SpringBoot的“致远汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“致远汽车租赁系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 致远汽车租赁系统总体功能模块图 系统首页界…

2024年 前端JavaScript 进阶 第3天 笔记

3.1-JS进阶-内容和两种编程思想 3.2-构造函数实现封装以及存在 3.3-原型对象prototype 3.4-数组扩展案例-求最大值和数组求和 3.5-constructor属性以及应用 3.6-对象原型proto 3.7-原型继承 3.8-原型链以及instanceof运算符 3.9-综合案例-模态框构造函数写法 3.10-综合案例-0pe…

Phpstorm配置Xdebug

步骤 1、先去官网找到对应的php xdebug的版本 2、配置phpstorm断点调试 网址&#xff1a;https://xdebug.org/ 查看php对应的xdebug版本&#xff1a;Xdebug: Support — Tailored Installation Instructions 1.1查看对应php xdebug版本 全选&#xff0c;复制到目标网址 我…

笔记本三屏异显方案——更新中,是否能够在FPGA上实现,淘宝购物的价格太贵

三屏是&#xff08;笔记本电脑屏幕&#xff0c;两个显示器屏幕&#xff09;&#xff0c;异显是采用屏幕的扩展功能&#xff0c;这样能够左边看视频文章&#xff0c;右边control cv代码。 一、 电脑有一个HDMI口的时候&#xff0c;只需要买一个TypeC&#xff08;雷电接口&#x…

FreeBSD下如何进行添加路由等配置?

FreeBSD系统可以当作一台路由器来使用&#xff0c;实际上当年路由器刚刚出来的时候&#xff0c;有很大一部分就是用主机安装FreeBSD来提供路由功能的。 路由的基础知识 路由&#xff0c;就是计算机网络中决定数据包从源地址到目的地址路径的一种传输过程。路由表&#xff0c;就…

【前端Vue】社交信息头条项目完整笔记第3篇:三、个人中心,TabBar 处理【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配。二、登录注册准备,实现基本登录功能,登录状…

vue 数据埋点

最近菜鸟做项目&#xff0c;需要做简单的数据埋点&#xff0c;不是企业级的&#xff0c;反正看渡一的视频&#xff0c;企业级特别复杂&#xff0c;包括但不限于&#xff1a;错误收集、点击地方、用户行为…… 菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间&a…

技术揭秘:如何打造完美互动的充电桩硬件与服务平台?

充电桩平台全套源码地址 https://gitee.com/chouleng/cdzkjjh.git 这张图像是一个系统或服务的架构图。以下是对图中各个部分的描述&#xff1a; 前端&#xff1a; 位于图像的顶部&#xff0c;颜色为浅绿色。用户服务端&#xff1a; 紧邻前端&#xff0c;颜色为淡黄色。设备服…

MOS管小电流发热怎么处理?

01 MOSFET的击穿有哪几种&#xff1f; Source、Drain、Gate —— 场效应管的三极&#xff1a;源级S、漏级D、栅级G。&#xff08;这里不讲栅极GOX击穿了啊&#xff0c;只针对漏极电压击穿&#xff09; 先讲测试条件&#xff0c;都是源栅衬底都是接地&#xff0c;然后扫描漏极…

【局部路径规划算法】—— DWA动态窗口法(c++实现))

参考资料&#xff1a; &#xff08;1&#xff09;机器人局部避障的动态窗口法(dynamic window approach) &#xff08;2&#xff09;机器人局部避障的动态窗口法 &#xff08;3&#xff09;局部规划算法&#xff1a;DWA算法原理 &#xff08;4&#xff09;SLAM学习&#xff1a;…

安卓开机动画

目录 一、开机动画的2种模式1.1 android模式2.2 movie模式 二、开机动画代码运行位置三、删除开机动画四、自定义开机动画实践 一、开机动画的2种模式 一种是使用两张图片利用某种效果来造成动态&#xff0c;另一种则是用一个图包循环显示的方式来形成动态。当然&#xff0c;这…

软考高级架构师:CISC (复杂指令集计算机) 和 RISC (精简指令集计算机)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

去班味的尽头是风险管理

运维工程师的“班味”是从风险管理就加重的。 什么是班味呢&#xff1f;指的是打工人身上特有的疲惫气质&#xff0c;面色憔悴、双目无神和腰酸背痛都是“班味”的显著表现。习惯性回复“收到&#xff0c;马上来”、不自觉唉声叹气、下班也提不起精神等症状&#xff0c;则说明…

Spring Boot:Web开发之视图模板技术的整合

Spring Boot 前言Spring Boot 整合 JSPSpring Boot 整合 FreeMarkerSpring Boot 整合 ThymeleafThymeleaf 常用语法 前言 在 Web 开发中&#xff0c;视图模板技术&#xff08;如 JSP 、FreeMarker 、Thymeleaf 等&#xff09;用于呈现动态内容到用户界面的工具。这些技术允许开…