当前位置: 首页 > article >正文

Day3 记忆内容:map set 高频操作

以下是 第三天 的详细学习内容,聚焦 mapset的高效应用,重点突破查找类题型去重逻辑,助你提升代码效率!


📚 Day3 记忆内容:map & set 高频操作

1. map 核心操作(手写3遍)
// 初始化
map<string, int> mp;                   // 有序(按key升序)
unordered_map<string, int> ump;         // 无序(哈希表,查询O(1))// 关键API
mp["apple"] = 5;                       // 插入/修改(若key不存在则创建)
mp.insert({"banana", 3});              // 插入(若key存在则不覆盖)
auto it = mp.find("apple");            // 返回迭代器(未找到返回mp.end())
mp.erase(it);                          // 通过迭代器删除
mp.count("apple");                     // 返回存在次数(0或1)
mp.lower_bound(50);                    // 返回首个≥key的迭代器(有序map特有)// 遍历(C++17风格)
for (auto& [key, value] : mp) { cout << key << ":" << value << endl;
}
2. set 核心操作(手写3遍)
// 初始化
set<int> s;                            // 有序集合(元素唯一)
unordered_set<int> us;                 // 无序集合(哈希实现)// 关键API
s.insert(10);                          // 插入元素
s.erase(10);                           // 删除元素
auto it = s.find(5);                   // 查找元素
s.count(5);                            // 是否存在
s.lower_bound(8);                      // 返回首个≥8的迭代器(有序set特有)
3. 易错点总结
  • mapoperator[] 访问不存在的key时会自动插入(value默认初始化)
  • 遍历时删除元素会导致迭代器失效,需先保存后删除
  • unordered_map 的 key 需要支持哈希函数(自定义类型需特化 std::hash

💻 Day3 练习题(每题限时25分钟)

题目1:统计单词频率(map应用)

题目描述
输入一段英文文本(不含标点),统计每个单词的出现频率(区分大小写)。
示例输入/输出
输入:"Apple banana apple Apple"
输出:Apple:3, banana:1, apple:1

关键思路

  1. map<string, int> 存储单词和频率
  2. 遍历分割后的单词,更新map

参考代码

#include <sstream>map<string, int> wordCount(const string& text) {map<string, int> freq;istringstream iss(text);string word;while (iss >> word) {freq[word]++;  // 自动处理不存在的情况}return freq;
}

题目2:两数之和(unordered_map应用)

题目描述
给定整数数组 nums 和目标值 target,返回两数之和等于目标值的下标(假设答案唯一)。
示例输入/输出
输入:nums = [2,7,11,15], target = 9
输出:[0,1]

关键思路

  1. unordered_map 存储值到索引的映射
  2. 遍历时检查 target - num 是否已存在

参考代码

vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> val2idx;for (int i = 0; i < nums.size(); i++) {int complement = target - nums[i];if (val2idx.count(complement)) {return {val2idx[complement], i};}val2idx[nums[i]] = i;  // 后插入当前数,避免重复使用同一元素}return {};
}

📝 今日卡壳点记录表

卡壳位置错误原因修正方法
误用 map.insert 覆盖值未判断直接插入导致旧值丢失先用 find 检查是否存在
哈希表遍历顺序问题误以为 unordered_map 有序需明确无序特性
未处理单词大小写差异题目要求区分大小写保持原词,不转小写

⏰ 今日时间安排建议

18:00-18:30 手写 map/set 模板(重点区分有序和无序容器)
18:30-19:00 练习单词统计(注意istringstream的分割用法)
19:00-19:30 练习两数之和(体会哈希表O(1)查询优势)
19:30-20:00 对比参考代码,记录map插入逻辑的优化点

map和set是CSP中高频考点,尤其是两数之和这类哈希优化题!坚持手写,明天进入优先队列专题! 🔥

http://www.lryc.cn/news/2386877.html

相关文章:

  • 初等数论--Garner‘s 算法
  • NV211NV212美光科技颗粒NV219NV220
  • SQL解析工具JSQLParser
  • Wave Terminal + Cpolar:SSH远程访问的跨平台实战+内网穿透配置全解析
  • html使用JS实现账号密码登录的简单案例
  • sorted() 函数和sort()函数的区别
  • Solr搜索:比传统数据库强在哪?
  • 【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)
  • 51c自动驾驶~合集55
  • 【前端基础】Promise 详解
  • 高性能管线式HTTP请求
  • c/c++的opencv膨胀
  • react native搭建项目
  • 【CSS】九宫格布局
  • Python用Transformer、Prophet、RNN、LSTM、SARIMAX时间序列预测分析用电量、销售、交通事故数据
  • java基础(面向对象进阶高级)泛型(API一)
  • 学习心得(17--18)Flask表单
  • AI测试和敏捷测试有什么联系与区别?
  • 微信小程序进阶第2篇__事件类型_冒泡_非冒泡
  • 电机控制学习笔记
  • 什么是前端工程化?它有什么意义
  • 企业网站架构部署与优化-Nginx性能调优与深度监控
  • 行列式的线性性质(仅限于单一行的加法拆分)
  • JAVA基础编程练习题--50道
  • leetcode 93. Restore IP Addresses
  • 【东枫科技】基于Docker,Nodejs,GitSite构建一个KB站点
  • pytest+allure+allure-pytest 报告输出遇到的问题汇总
  • Python基础语法(十四):Python常用内置模块及功能
  • 【Opencv+Yolo】_Day1图像基本处理
  • MySQL各种日志类型介绍