C++——map相关的oj题

前言:菜鸟写博客给自己看,我是菜鸟。

1:随机链表的复制

1.1题目要求:

1.2解题思路:

可以分两步来实现代码

①先将示例1链表中的val值以及next的指向关系深拷贝到另一个新的链表当中

②再处理新链表中,random的指向关系。

思考

第①步是很容易实现的,那么如何处理新链表中random的指向关系呢?这时候可以试着用map去解决。

map<key,T>

map<key,T>的底层是红黑树,其内部的数据是使用pair<key,T>存储键值对数据(这里的key,T是数据类型),键值对是一一对应/映射的关系。举一个简单的例子:

"苹果" <-> "apple"

"橘子" <-> "orange" 

其中,key是不可修改的,而T是可修改的。

分析

在第①步创建新节点的同时,将新节点与旧节点通过map<Node*,Node*> 建立键值对的关系,这样就得到了新旧节点间的映射关系。

更进一步的,再仔细想想如何处理新链表中random的指向关系呢?

新节点->random = 旧节点->random  吗? 显然不是,题目要求构造一个全新的链表,这样的指向关系,会使得新旧链表的random指向同一个节点。

因此不是 新节点->random = 旧节点->random ,而是 新节点->random = 旧节点->random所映射的节点,可以通过map函数中的operator[]来实现。

总结

在第①步创建链表的同时,将新旧节点通过map<Node*,Node*>建立映射关系。

在第②步中,可以通过映射关系,例如 旧13节点的random 指向 7节点,那么 新13节点 可以通过 旧13节点的random 先找到 旧7节点,再根据 map<Node*,Node*> 建立的映射关系,找到 新7节点 ,从而建立正确的指向关系

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*> copymap;Node* copyhead = nullptr;Node* copytail = nullptr;Node* cur = head;while(cur){if(copyhead == nullptr){copyhead = copytail = new Node(cur->val);}else{copytail->next = new Node(cur->val);copytail = copytail->next;}copymap[cur] = copytail;cur = cur->next;}Node* copy = copyhead;cur = head;while(cur){if(cur->random == nullptr){copy->random = nullptr;}else{copy->random = copymap[cur->random];}cur = cur->next;copy = copy->next;}return copyhead;}
};

2:前K个高频单词

2.1题目要求:

前言:这是一道综合应用stl的题目,难度对于新人(博主)来说有点大,本题涉及一些对先前知识的查漏补缺。

2.2解题思路:

思路

👉:首先应该想到的是:创建一个map<string,int>  CountMap 来统计每个单词出现的个数。

👉:map类会自动将数据按照 key(前一个数据类型)来排列,即此时 CountMap 中的数据是按照 string(对应首字母的ascii码值)来排序。

👉:但是题目要求是出现次数多的在前,因此我们需要对map中的数据做处理

👉:将map中的数据拷贝到vector中,并排列得到我们想要的顺序

👉:最后再输出vector中前k个字母。

注:上述还涉及很多细节问题,在2.3中再做讨论。

2.3实现代码:

class Solution {
public:struct compare{bool operator()(const pair<string,int>& x1,const pair<string,int>& x2){return x1.second > x2.second || (x1.second == x2.second && x1.first < x2.first);}};vector<string> topKFrequent(vector<string>& words, int k) {//统计每个字母出现的次数map<string,int> CountMap;for(auto& e : words){CountMap[e]++;}//将map中的数据拷贝到vector中进行比较vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//按字符串顺序排列//默认的比较方式不满足我们的要求,因此需要自己写一个仿函数来实现stable_sort(v.begin(),v.end(),compare());//取前K个单词,并存放到 str 中作为返回值vector<string> str;for(int i = 0; i<k; i++){str.push_back(v[i].first);}return str;}
};

将代码逐一拆分解释:

        map<string,int> CountMap;for(auto& e : words){CountMap[e]++;}

该段代码用于统计每个字母出现的次数,通过map类(map<string,int>)来记录单词与出现字数之间的映射关系。

map<key,T>  map类会按照key默认进行排序

        vector<pair<string,int>> v(CountMap.begin(),CountMap.end());//按字符串顺序排列stable_sort(v.begin(),v.end(),compare());

因为map类的默认排序不满足题给要求,因此我们需要新创建一个vector类,来保存map类中的数据。

★★★:在map类中,iterator的返回类型是:pair<Key,T>。因此在创建 vector类时,默认参数为:pair<string,int>

问:这里为什么不用sort?而是用stale_sort,二者有什么区别?

:编译不通过是一回事,更重要的是,排序的稳定性!

复习:排序分为稳定排序和不稳定排序,两者的区别在于:原本的数据如果已经满足排序要求,当前排序算法会不会改变原先的排列顺序,改变->不稳定排序;不改变->稳定排序

稳定排序:冒泡排序、插入排序、归并排序

不稳定排序:希尔排序、快速排序、堆排序等

其次:stable_sort 默认排序不满足我们的要求,因此需要自己写一个仿函数来实现我们所需的排序,如下:

    struct compare{bool operator()(const pair<string,int>& x1,const pair<string,int>& x2){return x1.second > x2.second;}};

compare() 涉及匿名对象调用的问题,可以通过两种方式来让stable_sort来调用我们的函数,一种是实例化compare对象,通过实例化的对象来调用,例如

        compare com;stable_sort(v.begin(),v.end(),com); 

此时不需要加括号,还有一种就是图中代码所写的匿名对象来调用。

注1:大多数时候,我们是不用写第三个参数的,只不过有些时候因为默认参数不满足我们的要求,因此这种时候需要通过仿函数来满足自己的要求。

注2:operator(),这个在优先队列一节中也曾使用过。

        vector<string> str;for(int i = 0; i<k; i++){str.push_back(v[i].first);}

此时v中的数据已经按题目要求进行排序,只需将前k个字母插入到 str 当中即可得到最终答案。

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

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

相关文章

go web单体项目 学习总结

为什么学习go 博主的主语言是Java&#xff0c;目前的工作也是做Java web开发&#xff0c;有了Java的经验后就想着再学一门语言&#xff0c;其实有两个原因&#xff0c;第一是基于兴趣&#xff0c;也想和Java对比下到底有什么不同&#xff0c;在学习go的时候让我更加了解了Java…

paimon的四种changelog模式(2)-none模式

# 请先了解input模式 环境创建 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog );USE CATALOG fs_catalog;drop table if exists t_changelog_none ;CREATE TABLE t_changelog_none (age BIGINT,money BIGINT,hh STRING,PRIMARY KEY (h…

新型大语言模型的预训练与后训练范式,阿里Qwen

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

NAT:连接私有与公共网络的关键技术(4/10)

一、NAT 的工作原理 NAT 技术的核心功能是将私有 IP 地址转换为公有 IP 地址&#xff0c;使得内部网络中的设备能够与外部互联网通信。其工作原理主要包括私有 IP 地址到公有 IP 地址的转换、端口号映射以及会话表维护这几个步骤。 私有 IP 地址到公有 IP 地址的转换&#xff1…

notepad++文件github下载

1、github下载网址&#xff1a;Releases notepad-plus-plus/notepad-plus-plus GitHub 2、找到操作系统支持的软件&#xff1a; 3、CSDN下载链接&#xff1a;https://download.csdn.net/download/u013083576/90046203

【AI绘画】Midjourney进阶:色调详解(下)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;Midjourney中的色彩控制为什么要控制色彩&#xff1f;为什么要在Midjourney中控制色彩&#xff1f; &#x1f4af;色调纯色调灰色调暗色调 &#x1f4af…

【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

PH热榜 | 2024-11-27

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Agentplace 标语&#xff1a;这是一个能创建互动式AI网站和应用的平台。 介绍&#xff1a;Agentplace是一个平台&#xf…

ffmpeg 增亮 docker 使用

使用最新的 docker pull jrottenberg/ffmpeg docker run -it --rm -v /path/to/input:/input -v /path/to/output:/output jrottenberg/ffmpeg <ffmpeg command>比如我想增亮 在 /home 目录下 有一个 video.mp4 docker run --rm -v /home:/home jrottenberg/ffmpeg:7…

单片机学习笔记 11. 外部中断

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

【PyTorch】(基础一)----pytorch环境搭建

PyTorch环境搭建 该系列笔记主要参考了小土堆的视频教程&#xff0c;传送门&#xff1a;P1. PyTorch环境的配置及安装&#xff08;Configuration and Installation of PyTorch)【PyTorch教程】_哔哩哔哩_bilibili PyTorch 是一个开源的机器学习库&#xff0c;主要用 Python 编…

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案&#xff1a; 这个问题应该是支付宝基础库的问题&#xff0c;除了依赖于官方更新之外&#xff0c;开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar&#xff0c;这样即使 tabBar 被渲染出来&#xff0c;但从视觉上也不会有问题 1.官方文…

YOLOv11融合PIDNet中的PagFM模块及相关改进思路

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2…

NSCTF 做题笔记

[GWCTF 2019]pyre 下载附件&#xff0c;是一个pyc文件。 转换为py文件。 在用vscode打开。 分析源码。源码就是进行了异或和数值转换。 有一点很坑&#xff0c;凑得中的值要转换为ASCII值否则就是一串乱码。 编写脚本&#xff1a; #include<iostream> #include<s…

java——spring容器启动流程

Spring容器的启动流程是一个复杂但有序的过程&#xff0c;它涉及多个步骤来确保应用程序的组件被正确加载、配置和初始化。以下是Spring容器启动的主要步骤&#xff1a; 一、加载配置文件 Spring容器首先会加载配置文件&#xff0c;这些配置文件通常包含了应用程序的组件、依…

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助其官方网站:http…

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c;用unittest进行测试。 其中&#xff0c;接口关联的参数通过正则进…

基本功能实现

目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…

Android 13 Aosp 默认允许应用动态权限

图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…

操作系统 内存管理——针对实习面试

目录 操作系统 内存管理什么是虚拟内存&#xff1f;什么是物理内存&#xff1f;解释虚拟内存和物理内存的区别什么是分页式存储&#xff1f;什么是分段式存储&#xff1f;解释分页式存储和分段式存储的区别什么是内存碎片&#xff1f;描述几种常见的内存分配算法描述几种常见的…