数据结构 —— 键值对 map

目录

map的若干操作

1、emplace()

2、find(key)

3、count(key)

4、lower_bound 和 upper_bound

5、erase()

6、empty()

7、降序的map

计蒜客T3603 叫号系统

题意:

解题思路:

Code:

Leetcode1309 解码字母到整数映射

题意:

解题思路:

Code:

Leetcode205 同构字符串

题意:

解题思路:

Code:

计蒜客T1271 完美K倍子数组

题意:

解题思路:

Code:


        今天主要是map专题,一般map只是一个映射,在程序中大多是一个辅助的存在。不像前面的队列和栈,它们特殊的结构有一些衍生的算法思想。而map主要是熟悉它的操作,可以更方便的查找。其实原本今天的题目和map关系不是特别大,但是写到最后一题有很多相关的操作我都很少有用过,查了很多又改了好久才模拟出来。所以在最开始先盘点一下map常用的操作~


map的若干操作

map 键值对(key - value)

1、emplace()

功能:原地构造键值对,效率更高。
示例:

myMap.emplace(2, "banana"); // 直接构造,无需创建临时对象

2、find(key)

功能:通过键查找目标,找到了就返回相应迭代器,如果没找到返回end()。

示例:

auto it = myMap.find(2);
if (it != myMap.end())cout << "找到键 " << it->first << ": " << it->second;
else cout << "未找到";

3、count(key)

功能:查找此键的个数,由于每个键在map中只能出现一次,所以只会返回1或0,可用于判断某个键是否存在。

示例:

if (myMap.count(3) > 0)cout << "键3存在";

4、lower_bound 和 upper_bound

功能

  • lower_bound:返回第一个大于等于 key 的迭代器。
  • upper_bound(key):返回第一个大于 key 的迭代器。

示例:

map<int, string> myMap = {{1, "a"}, {3, "c"}, {5, "e"}};
auto low = myMap.lower_bound(3); // 指向键3
auto up = myMap.upper_bound(3);  // 指向键5

5、erase()

功能:​​​​​​​删除指定元素。

示例:

myMap.erase(key);           // 按键删除
myMap.erase(2);            // 删除键2
myMap.erase(myMap.begin()); // 删除第一个元素
myMap.erase(it);            // 按迭代器删除
myMap.erase(first, last);   // 删除区间 [first, last)

6、empty()

功能:判断此时是否为空,返回值为bool类型。

示例:

if (myMap.empty()) cout << "容器为空";

7、降序的map

功能:由于map会自动进行排序,系统默认是升序排序,其实还可以降序

示例:

map<int, int, greater<int>> myMap;myMap[3] = 30;
myMap[1] = 10;
myMap[4] = 40;
myMap[2] = 20;// 输出结果会是 4,3,2,1
for (auto i : myMap)cout << i.first << ":" << i.second << endl;

常用的函数基本就这些了,其实map的主要功能是映射,这些函数是锦上添花。下面看几道题吧~

计蒜客T3603 叫号系统

链接:叫号系统 - 计蒜客

本题很好的考察了map的基本性质,比如排序,键、值的查找等。

题意:

    给定1~7七种操作,根据操作执行。

  • op=1:将id和u录入系统;
  • op=2:找紧急程度最小的患者,输出id并删除.如果没有输出error;
  • op=3:找紧急程度最大的患者,输出id并删除.如果没有输出error;
  • op=4:将编号为id的病人紧急程度改为urg;
  • op=5:将紧急程度为urg的病人编号改为id;
  • op=6:查找标号为id的病人的urg并输出,如果没有输出error;
  • op=7:查找紧急程度为urg的病人的id并输出,如果没有输出error;

解题思路:

       本题是个大模拟,要对键、值的查找比较熟悉,操作比较多需要认真一点。

接下来直接看代码吧。

Code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define endl '\n'
const int N = 1e6+5;
map<int, int> mp;
int id,u;//Id和紧急程度
int op;
void solve()
{cin >> op;if(op==1)//将id和u录入系统{cin >> id >> u;mp[u]=id;//由于后面要找紧急程度的大小,所以按urg排序}if(op==2)//找紧急程度最小的患者,输出id并删除.如果没有输出error{if(mp.empty()){cout << "error" << endl;return ;}auto it = mp.begin();//迭代器类型索引用->cout << it->se << endl;mp.erase(it);}if(op==3)//找紧急程度最大的患者,输出id并删除.如果没有输出error{if(mp.empty()){cout << "error" << endl;return ;}auto it = --mp.end();//索引最后一个的时候用--end,end是最后一个的下一个cout << it->se << endl;mp.erase(it);}if(op==4)//将编号为id的病人紧急程度改为urg{cin >> id >> u;for(auto i:mp){if(i.se==id){auto it=mp.find(i.fi);mp.erase(it);mp[u]=id;break;}}}if(op==5)//将紧急程度为urg的病人编号改为id{cin >> id >> u;for(auto i:mp){if(i.fi==u){mp[u]=id;break;}}}if(op==6)//查找标号为id的病人的urg并输出,如果没有输出error	{cin >> id;int f=0;for(auto i:mp){if(i.se==id){f=1;cout << i.fi << endl;return ;}}if(!f) cout << "error" << endl;}if(op==7)//查找紧急程度为urg的病人的id并输出,如果没有输出error	{cin >> u;if(mp.find(u)==mp.end()){cout << "error" << endl;return ;}else{auto it=mp.find(u);cout << it->se << endl;}}
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;cin >> t;while(t--) solve();return 0;
}

Leetcode1309 解码字母到整数映射

链接:1309. 解码字母到整数映射 - 力扣(LeetCode)

本题我直接用ASCII进行存值,但此题有点麻烦导致写的时候感觉有点乱

题意:

        根据题中给的解码规则进行解码。

解题思路:

        1~9的解码比较容易,10之后的有点麻烦,我是将数字和#分开判断,注意的是10之后一次是占据三个位置,注意下标不要超。

Code:

class Solution {
public:string freqAlphabets(string s) {map<int, int> m;string s1="";for(int i=1; i<=26; i++) m[i]='a'+i-1;//创建键值对int i;for(i=0; i<s.size()-2; i++)//如果i在后两个i+2会超{if(s[i+2]!='#') s1+=m[s[i]-'0'];else{int num=(s[i]-'0')*10+s[i+1]-'0';s1+=m[num];i+=2;}}if(i>s.size()-3)//单独处理在后两位的情况for(auto j=i; i<s.size(); i++) s1+=m[s[i]-'0'];return s1;}
};

Leetcode205 同构字符串

链接:205. 同构字符串 - 力扣(LeetCode)

题目其实还是比较简单,需要注意的点就是所有的键和值都是唯一的。

题意:

        给定两个字符串看它们是否完全符合一定的映射规则。

解题思路:

        按照所给字符串进行映射关系的建立和判断,如果前后冲突则为否。

Code:

class Solution {
public:bool isIsomorphic(string a, string b) {map<int, int> m;//这里用字符的ASCII码进行映射map<int, int> m1;for(int i=0; i<a.size(); i++){if(m[a[i]])//有值的话判断值{if(m[a[i]]!=b[i])return 0;}else//没值先判断当前值是否被映射过{if(m1[b[i]]) return 0;m[a[i]]=b[i],m1[i]=1;//没有就赋值,再标记一下表示被映射过}}return 1;}
};

计蒜客T1271 完美K倍子数组

链接:完美K倍子数组 - 计蒜客

这题大思路是对的,就是情况没考虑周全。

题意:

        给定一个长度为n的序列,找到一个子数组使得数组中的每个元素两两之和都是k的倍数。

解题思路:

        由于数组中所有的数之和都是k的倍数,那首先很容易想到如果所有数都是它的倍数那么就都可以了。由于是两两之和,所以如果K为偶数的话,如果余数为k/2的数两两相加那么也一定是k的倍数。如果前面的情况都不是,那么当两个数相加刚好等于k的倍数的时候那也可以,有点像昨天的某一道题。

Code:

unordered_map<int, int> m;//余数->出现次数
void solve()
{cin >> n >> k;for(int i=1; i<=n; i++)cin >> a[i],m[a[i]%k]++;if(k%2==0){//余数刚好是k/2/*例: 5 105 5 15 25 95*/for(int i=1; i<=n; i++) if(a[i]%k==k/2) num++;ans=max(ans,num);num=0;}for(int i=1; i<=n; i++) if(a[i]%k==0) num++;ans=max(ans,num),num=0;if(ans<2){for(int i=1; i<=n; i++) {int r = a[i]%k;//余数int c = (k-r)%k;//刚好和余数互补if(m[c]&&(m[c]>=2||(m[c]>= 1&&c!=r))){ans=2;break;}}}if(ans<2)cout << -1;else cout << ans;
}

总体来说题目依旧比较高质量,虽然没什么算法,但也暴露出基本功的问题,不涉及算法的题还要修改好久,思路不够灵敏,继续加油吧!

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

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

相关文章

C++ 性能优化指南

C 性能优化指南&#xff08;针对 GCC 编译器&#xff0c;面向高级工程师面试&#xff09; 代码优化面试常问点&#xff1a; 如何避免不必要的对象拷贝&#xff1f;为什么要用引用或 std::move&#xff1f;虚函数调用有什么性能开销&#xff1f;原理解释&#xff1a; 传递对象时…

拼数(字符串排序)

题目描述设有 n 个正整数 a1​…an​&#xff0c;将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。输入格式第一行有一个整数&#xff0c;表示数字个数 n。第二行有 n 个整数&#xff0c;表示给出的 n 个整数 ai​。输出格式一个正整数&#xff…

【MySQL】函数学习-字符串函数

一、MySQL字符串函数基础回顾 在MySQL中&#xff0c;字符串函数用于处理文本数据&#xff0c;常见场景包括数据拼接、格式转换、清洗等。以下是核心函数速览&#xff1a;函数名作用说明基础示例&#xff08;独立运行&#xff09;CONCAT(s1,s2)拼接多个字符串SELECT CONCAT(heel…

AI不是“心智的蒸汽机“:重新理解人工智能的本质

当我们谈论人工智能时&#xff0c;最常听到的比喻是"心智的蒸汽机"——一个能够自动化认知任务的强大工具。但这个比喻可能从根本上误导了我们对AI真正潜力的理解。 最近&#xff0c;来自科罗拉多大学丹佛分校和肯尼索州立大学的研究团队发表了一篇论文[1]&#xff0…

免费的AI Logo工具生成的Logo质量怎么样?我对比了7个AI Logo生成器,设计必备

你尝试过用 AI 生成 Logo 吗&#xff1f;在 AI 巨火的今天&#xff0c;什么事情都可以尝试用 AI 去做。在品牌设计上也是如此&#xff0c;用 AI 做品牌设计、用 AI 做电商海报、用 AI 做包装设计等等。不知道你用过哪些 AI 工具&#xff0c;哪些是你觉得好用的。今天我们就来研…

计算机基础:内存模型

专栏导航 上一篇&#xff1a;WIndows 编程辅助技能&#xff1a;格式工厂的使用 回到目录 下一篇&#xff1a;MFC 第一章概述 本节前言 本来呢&#xff0c;没想着在单独的课节中讲解内存模型。但是呢&#xff0c;在我写过的一些个课节中&#xff0c;我发现&#xff0c;内存…

Sigma-Aldrich 细胞培养实验方案 | 通过Hoechst DNA染色检测细胞的支原体污染

目标DNA染色&#xff08;如间接Hoechst染色技术&#xff09;一种快速的方法&#xff0c;其可在72小时内获得结果&#xff0c;这相较于通过培养分离检测支原体所需的4周时间相比是更加有利的。用DNA染色剂对细胞系进行直接染色可在24小时内获得结果&#xff0c;但会大大降低灵敏…

需求跟踪深度解析:架构师视角下的全链路追溯体系

需求跟踪&#xff08;Requirements Traceability&#xff09;是确保软件系统从业务目标到代码实现全程可追溯的核心实践&#xff0c;尤其在安全关键系统&#xff08;如航空、医疗&#xff09;中具有强制性要求。一、需求跟踪的四大核心价值变更影响分析 精确评估需求变更波及范…

《棒球规则介绍》领队和主教练谁说了算·棒球1号位

Baseball 101&#xff5c;GM vs Manager 到底谁是球队话事人&#xff1f; ⚾️权力金字塔&#xff1a;谁说了算&#xff1f;General Manager&#xff08;总经理/GM&#xff09;球队建筑师&#xff1a;负责选秀&#xff08;Draft&#xff09;、交易球员&#xff08;Trade&#x…

电力自动化的通信中枢,为何工业交换机越来越重要?

在“新能源数字化”双轮驱动下&#xff0c;电力行业正经历深刻变革&#xff0c;传统变电站也迎来了向智能化、自动化加速转型的时代。作为连接站内各级系统与装置的数据“中枢”&#xff0c;工业以太网交换机已成为现代变电站自动化系统中不可或缺的核心设备。在这场深度重构的…

【Linux仓库】命令行参数与环境变量【进程·伍】

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; Linux Linux is not Unix &#xff01; &#x1f680; 今天来学习命令行参数与环境变量的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更多…

R 数据框:深入解析及其在数据分析中的应用

R 数据框:深入解析及其在数据分析中的应用 引言 R语言作为一种强大的统计计算和图形工具,在数据分析领域有着广泛的应用。数据框(DataFrame)是R语言中处理数据的一种重要结构,它类似于其他编程语言中的表格或关系数据库中的表。本文将深入解析R数据框的概念、特点、创建…

机器学习数据集划分全指南:train_test_split详解与实践

目录 一、为什么需要划分数据集&#xff1f; 二、train_test_split基础用法 2.1 最简单的划分方式 2.2 参数说明 三、实际应用案例&#xff1a;Iris数据集划分 四、高级技巧与注意事项 4.1 分层抽样&#xff08;Stratified Sampling&#xff09; 4.2 时间序列数据划分 …

python-77-数据序列化框架Avro数据格式编码和解析

文章目录 1 avro简介1.1 关键特点1.2 无需标记2 使用步骤2.1 定义Avro模式2.2 编码Avro数据2.3 解析Avro数据3 DataFileWriter和DataFileReader3.1 写入DataFileWriter3.2 读取DataFileReader3 文件中存储16进制字符串3.1 十六进制字符串3.2 代码示例4 接收kafka中的avro数据5 …

IAR携手矽力杰与普华基础软件,共推RISC-V车规芯片高安全应用落地

芯片 基础软件 开发工具三方协同&#xff0c;赋能国产汽车电子加速自主演进 在“软件定义汽车”持续重塑产业格局的当下&#xff0c;构建安全、高效、可扩展的本土汽车电子生态已成为行业共识。 IAR嵌入式开发解决方案现已全面支持矽力杰SA32B系列和即将量产的SA32D系列车规…

Vscode——报错,加载 Web 视图时出错: Error: Could not register service worker

Vscode——报错完整信息 加载 Web 视图时出错: Error: Could not register service worker: InvalidStateError: Failed to register a ServiceWorker: The document is in an invalid state… 很有意思下班前还是好的&#xff0c;上班发现下载的Ai code 无法正常使用了 解决…

Java-Collections、Map

目录 1.可变参数 2.Collections工具类 不同集合类型的排序方法比较 3.斗地主游戏 4.Map集合 4.1 Map集合概述 4.2 Map集合的常用方法 4.3 Map集合的遍历方式 4.4 Map集合案例—统计投票人数 4.5 HashMap 4.6 LinkedHashMap 4.7 TreeMap 5.集合的嵌套 1.可变参数 import …

开源界迎来重磅核弹!月之暗面开源了自家最新模型 K2

1. 模型简介 Kimi K2 是一款尖端专家混合&#xff08;MoE&#xff09;语言模型&#xff0c;激活参数量达320亿&#xff0c;总参数量突破1万亿。该模型采用Muon优化器训练&#xff0c;在前沿知识、推理和编程任务中展现出卓越性能&#xff0c;同时针对智能体能力进行了精细化优…

Grok-4 发布会图文总结

文章目录00:00 - Grok-4&#xff1a;以“全球最智能 AI”之名突破性登场06:41 - 推理能力的大幅飞跃&#xff1a;100 倍训练量铸就的“博士级”大脑13:25 - 工具使用能力的革新&#xff1a;从“原始”到深度整合20:06 - 直面强化学习的挑战与 AI 的终极测试26:45 - 应用演示&am…

AI产品经理面试宝典第1天:机器学习核心算法全景解析

面试官:请解释什么是监督学习?能否用生活案例说明其运作逻辑? 监督学习如同教孩子识字的过程。父母指着"苹果"图片反复说"这是苹果"(带标签的训练数据),孩子逐渐建立"红色圆形水果=苹果"的认知模型(算法生成)。当孩子看到新图片时,模型…