map和set题目练习

一、习题一:随机链表的复制

1.1题目详情

1.2思路

在没有学习map和set之前,解决这道题最大的问题就在于无法建立原链表与拷贝链表的映射关系,只能通过在原链表每个节点后面新建一个新的链表来进行节点间的对应,而学习了map之后,就可以选用map<Node*,Node*>来建立两个链表之间的映射关系了

在map中,我们对[]进行了重载,可以实现没有对应key的节点时插入节点并对该处节点的value进行操作,有key节点的时候直接对key对应的value进行操作

综上,我们可以选择如下实现思路:

①复制一个新的链表

②创建一个map对象,利用它来创建原链表与新链表之间的映射关系

③更新随机因子random

1.3代码实现

①基本版

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {
public:Node* copyRandomList(Node* head) {map<Node*,Node*> m1;//复制链表Node* cur=head;Node* copy_n=nullptr;Node* c_cur=copy_n;while(cur){if(copy_n==nullptr){c_cur=new Node(cur->val);copy_n=c_cur;cur=cur->next;}else{c_cur->next=new Node(cur->val);c_cur=c_cur->next;cur=cur->next;}}//遍历,在map中建立一一映射关系cur=head;c_cur=copy_n;while(cur){m1[cur]=c_cur;//确定不会在map里有c_cur=c_cur->next;cur=cur->next;}//再次遍历,对随机值random进行更新cur=head;c_cur=copy_n;while(cur){if(cur->random==nullptr)c_cur->random=nullptr;else{c_cur->random=(m1.find(cur->random))->second;}c_cur=c_cur->next;cur=cur->next;}return copy_n;}
};

②改善版:映射关系的建立可以和链表的复制一同进行

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {
public:Node* copyRandomList(Node* head) {map<Node*,Node*> m1;//复制链表,其中copy_n起头节点作用,c_cur起尾节点作用Node* cur=head;Node* copy_n=nullptr;Node* c_cur=nullptr;while(cur){//头尾节点指向一起if(copy_n==nullptr){copy_n=new Node(cur->val);c_cur=copy_n;}//尾节点往后走else{c_cur->next=new Node(cur->val);c_cur=c_cur->next;}//为原链表与循环链表建立联系(嵌套在循环里)m1[cur]=c_cur;cur=cur->next;}//循环设置复制链表randomcur=head;c_cur=copy_n;while(cur){if(cur->random==nullptr)c_cur->random=nullptr;else//c_cur->random=(m1.find(cur->random))->second;//m1[cur->random]本身就返回second的值,且一定存在cur->randomc_cur->random=m1[cur->random];c_cur=c_cur->next;cur=cur->next;}return copy_n;}
};

二、习题二:判断是否循环链表

2.1题目详情

2.2思路

未学习map和set之前,我们使用了快慢指针的方式来解决这道题,但快慢指针的应用意味着我们需要进行循环必定相遇的求证,证明过程并不简单;但现在有了map和set,我们就可以选择直接插入节点到set中,因为set的insert会返回一个可以证明插入是否有效的

pair<iterator,bool>

利用这个bool我们可以轻易得出答案

2.3代码实现

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:bool hasCycle(ListNode *head) {ListNode *tmp=head;set<ListNode*> sl;while(tmp){if(!(sl.insert(tmp).second))return true;tmp=tmp->next;}return false;}
};

2.补:关于异地容灾备份

我们手机上的云存储其实对应的是一个数据同时存储在手机和服务器上,当在手机上删除了备份过的内容,服务器与手机进行同步服务的时候会自动把删除了的内容复原回去;

但是数据实在服务器上存储,服务器也是电脑,也有可能损坏,所以为了保证数据的安全性,有了数据容灾备份,采用一原本,多副本的方式彼此间进行同步

三、前k个高频单词

3.1题目详情

3.2思路

之前题目一的练习我们已经知道了map中重载[]的用法,在这里我们可以利用重载后的[]快速得到单词与单词出现次数的映射关系

有了映射关系以后,我们只需要设法通过次数对pair进行排序即可得到前k个需要的单词,可以在仿函数中书写逻辑,再调用系统函数sort

因为返回值是一个vector<string>类型的值,所以我们需要把map中的单词拷贝到vector中,此时我们距离成功只差一步,那就是按照字典序排序

那么我们就这么思考怎么排吗?要知道map中我们其实已经是按照key的字典序排列的,可不可以不消耗更多时间呢?

问题可以从sort上解决,因为sort的底层是快排与堆排结合,既然有快排,那么排序完以后就会变得不稳定,所以

①可以采用稳定排序stable_sort

②可以在仿函数中进行比较逻辑的特殊设定,让出现次数相同时按照字典序排序,以此来保证稳定

综上,我们可以得出思路:

①创建map对象,for循环建立映射关系

②补充仿函数逻辑,将其传入sort,并用sort进行次数的比较的出前k个单词

③把前k个单词放到一个新的vector中

3.2补:pair的比较大小

pair之间其实也支持比较大小,比如“<”符号,会先看first小不小,如果first小的话那这个pair就小;如果first大于等于的话会看second小不小,seconde小的话也会小

例如:

pair<int,int> p1=make_pair(5,7);pair<int,int> p2=make_pair(8,6);p1<p2;//p1的first比p2小,所以应该返回truep2<p1;//p2的first比p1大,所以要看p2的second,而p2的second比p1小,所以也返回true

通过这个例子不难看出,除非在特殊情况,否则最好不要去用pair本身自带的比较逻辑,因为与我们日常思维方式不符合

3.3代码实现

①使用stable_sort稳定排序

struct Compare
{bool operator()(const pair<string,int>& p1,const pair<string,int>& p2){//排降序return p1.second>p2.second;}
};class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {//创建map,建立单词出现顺序和次数的联系map<string,int> m;for(const auto& e:words){m[e]++;}//排序,提取出排名前几的单词vector<pair<string,int>> v_p;for(const auto& e:m){v_p.push_back(e);}//使用相对位置不改变的sort来确保字典序排序stable_sort(v_p.begin(),v_p.end(),Compare());vector<string> s;for(size_t i=0;i<k;i++){s.push_back(v_p[i].first);}return s;}
};

②修改仿函数逻辑保持稳定

struct Compare
{bool operator()(const pair<string,int>& p1,const pair<string,int>& p2){//排降序return p1.second>p2.second||(p1.second==p2.second&&p1.first<p2.first);}
};class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {//创建map,建立单词出现顺序和次数的联系map<string,int> m;for(const auto& e:words){m[e]++;}//排序,提取出排名前几的单词vector<pair<string,int>> v_p(m.begin(),m.end());//使用相对位置不改变的sort来确保字典序排序sort(v_p.begin(),v_p.end(),Compare());vector<string> s;for(size_t i=0;i<k;i++){s.push_back(v_p[i].first);}return s;}
};

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

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

相关文章

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例&#xff0c;这是第&#xff08;一&#xff09;例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

渗透测试学习笔记(五)网络

一.IP地址 1. IP地址详解 ip地址是唯一标识&#xff0c;一段网络编码局域网&#xff08;内网&#xff09;&#xff1a;交换机-网线-pcx.x.x.x 32位置2进制&#xff08;0-255&#xff09; IP地址五大类 IP类型IP范围A类0.0.0.0 到 127.255.255.255B类128.0.0.0 到191.255.25…

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl&#xff0c;环境如下&#xff0c; 由于是64位&#xff0c;因此根据书中的提示&#xff0c;从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…

jedis使用及注意事项

Jedis Jedis 是一个 Java 客户端&#xff0c;用于与 Redis 数据库进行交互。它提供了一系列简单易用的 API&#xff0c;使得在 Java 应用程序中使用 Redis 变得非常方便。以下是 Jedis 的使用方法及一些注意事项。 Jedis的优势 Lettuce客户端及Jedis客户端比较如下&#xff1a;…

浏览器执行机制

主线程 任务1&#xff0c;任务2 微队列微队列任务1&#xff0c; 微队列任务2延时队列延时队列任务1&#xff0c; 延时队列任务2交互队列.... 事件循环的工作原理 主线程执行同步任务&#xff1a; 主线程首先执行所有同步任务&#xff08;即栈中的任务&#xff09;。这些任务会…

Java 基础知识——part 4

8.成员方法&#xff1a;Java中必须通过方法才能对类和对象的属性操作&#xff1b;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息&#xff0c;方法类型和返回值类型同&#xff1b;返回值通过return返回&…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件&#xff1a;C/S系统、Winform桌面应用软件。 运行平台&#xff1a;Windows .NETCore&#xff0c;.NET8 开发工具&#xff1a;Visual Studio 2022&#xff0c;C#语言 数据库&#xff1a;Microsoft SQLServer 2012&#xff0c;Oracle 21c&#xff0c;MySQL8&#xf…

监控易 IDC 数据中心一体化智能运维平台:新质生产力的典范

一、引言 在当今数字化飞速发展的时代&#xff0c;IDC 数据中心作为信息产业的核心基础设施&#xff0c;其稳定、高效运行对于企业和社会的重要性不言而喻。随着数据量的爆炸式增长和业务复杂度的提升&#xff0c;传统的运维模式已难以满足需求&#xff0c;数据中心面临着诸多挑…

busybox学习——简单介绍

文章目录 简介官网源码目录结构构建 简介 BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils &#xff0c; shellutils等工具&#xff0c;BusyBox提供了一个比较完善的环境&#xff0c;可以适用于任…

CTFHUB 信息泄露 备份文件下载-网站源码

根据提示应是猜测网站源码的备份文件&#xff0c;可以采用bp拼接文件名和后缀 开启bp抓包后设置第一个攻击点导入文件名 第二个攻击点导入后缀 开始暴力破解&#xff0c;有成功响应的 拼接到网站后缀后可以直接下载 解压缩后记事本的名字就是flag 总结&#xff1a; …

Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)

效果预览 第一步&#xff1a; 告诉chatgpt&#xff1a; 将latex格式中的英文翻译为中文&#xff08;符号和公式不要动&#xff09;,给出latex格式第二步&#xff1a; Latex 转换为 Word&#xff08;使用GrindEQ &#xff09; 视频 https://www.bilibili.com/video/BV1f242…

X射线衍射全岩分析在岩石学研究中的重要性

X射线衍射全岩分析在岩石学研究中的重要性 X射线衍射&#xff08;XRD&#xff09;全岩分析在岩石学研究中扮演着至关重要的角色&#xff0c;它是一种非破坏性的分析技术&#xff0c;能够提供岩石和矿物的精细结构信息。通过解析材料内部原子排列的特征&#xff0c;XRD不仅揭示了…

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网&#xff1a;PromptCoder Bolt官网&#xff1a;https://bolt.new/ Bolt 是什么&#xff1f; Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示&#xff08;Prompt&#xff09;、运行&#x…

定时/延时任务-万字解析Spring定时任务原理

文章目录 1. 概要2. EnableScheduling 注解3. Scheduled 注解4. postProcessAfterInitialization 解析4.1 createRunnable 5. 任务 Task 和子类6. ScheduledTaskRegistrar6.1 添加任务的逻辑6.2 调度器初始化6.3 调用时机 7. taskScheduler 类型7.1 ConcurrentTaskScheduler7.2…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

ResNet网络:深度学习中的革命性架构

目录 ​编辑 引言 ResNet网络的特点 1. 残差块&#xff08;Residual Block&#xff09; 2. 恒等映射&#xff08;Identity Mapping&#xff09; 3. 深层网络训练 4. Batch Normalization 5. 全局平均池化 6. 灵活的结构 ResNet的应用案例 ResNet的研究进展 实战案例…

Node.js day-01

01.Node.js 讲解 什么是 Node.js&#xff0c;有什么用&#xff0c;为何能独立执行 JS 代码&#xff0c;演示安装和执行 JS 文件内代码 Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端…

又要考试了

一、实现无名管道练习&#xff1a;父进程写入管道&#xff0c;子进程读取管道数据。 #include<myhead.h> int main(int argc, const char *argv[]) {int fd[2];char buff[1024]"王吕阳&#xff0c;崔庆权别卷了";char s[1024];if(pipe(fd)-1){perror("pi…

LoadBalancer负载均衡和Nginx负载均衡区别理解

LoadBalancer和Nginx都是用来做负载均衡用的&#xff0c;那二者有什么区别呢&#xff1f; Nginx服务器端的负载均衡&#xff1a; 所有请求都先发到nginx&#xff0c;然后再有nginx转发从而实现负载均衡。LoadBalancer是本地的负载均衡&#xff1a; 它是本地先在调用微服务接口…

Technitium DNS Server的基本使用1(创建主区域,A记录,开启递归查询,递归到114.114.114.114)

Technitium DNS Server Technitium DNS Server搭建 搭建请看博主的上篇博客&#xff0c;内外网的方法都有 链接: 内网搭建Technitium DNS Server详细教程 登陆进去是以下界面 这个界面主要是监控&#xff0c;有访问的时候就会有波动 创建主区域&#xff0c;A记录 写上主区…