/img/avatar.jpg

【STL】vector容器用法

1 简介 🟠 vector 容器实现的是一个动态数组,即可以进行元素的插入和删除,并动态调整所占用的内存空间,整个过程无需人工干预。 🟡 在尾部插入/删除元素时,时间复杂度为O(1);在头部或者中部插入/删除元素时,时间复杂度为O(n)。 🔵 使用需加上头文件:#include <vector> 2 创建vector容器 1️⃣ 调用 vector 容器类的默认构造函数。(若默认指定了 std 命令空间,则 std:: 可省略) 1 std::vector<int> v1; 2️⃣ 在创建 vector 容器的同时,进行初始化。 1 std::vector<int> v1 {2, 3, 5, 7, 11, 13, 17, 19}; 3️⃣ 在创建 vector 容器时,指定元素个数。 v1 容器开始时就有 20 个元素,它们的默认初始值都为 0。圆括号中的2个参数既可以是常量,也可以是变量。 1 std::vector<int> v1(20, 0); 4️⃣ 通过迭代器,取已建 vector 容器中指定区域内的键值对,创建并初始化新的 vector 容器。 1 2 3 4 int array[]={1,2,3}; std::vector<int>v1 (array, array+2); //v1 将保存{1,2} std::vector<int>v1 {1,2,3,4,5}; std::vector<int>v2 (std::begin(v1),std::begin(v1)+3); //v2保存{1,2,3} 3 常用的成员方法 成员方法 功能 begin() 返回指向容器中第一个元素的迭代器。 end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 size() 返回实际元素个数。 capacity() 返回当前容量。 empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 reserve() 增加容器的容量。 front() 返回第一个元素的引用。 back() 返回最后一个元素的引用。 push_back() 在序列的尾部添加一个元素。 pop_back() 移出序列尾部的元素。 insert() 在指定的位置插入一个或多个元素。 erase() 移出一个元素或一段元素。 clear() 移出所有的元素,容器大小变为 0。 swap() 交换两个容器的所有元素。 emplace() 在指定的位置直接生成一个元素。

【数据结构设计】常数时间查找数组元素

1 题目 力扣 380. O(1) 时间插入、删除和获取随机元素 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。 bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。 int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。 你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。 2 解析 考虑题目的两个要求: 🔴 插入、删除、查询随机元素的时间复杂度必须都是 O(1)。 想到使用 STL 中的 map 结构。 🟡 getRandom() 必须等概率的返回随机元素。 那么底层必须用数组实现,且数组是紧凑的,这样就可以直接生成随机数作为数组索引。 🟢 综合考虑以上2个条件:在 O(1) 的时间删除数组中的某⼀个元素 val,可以先把这个元素交换到数组的尾部,然后再 pop 掉。而交换两个元素需要知道索引,故用哈希表存储每个元素及其索引。 代码实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 class RandomizedSet { public: // 存储元素的值 vector<int> ve; // 键是元素值,值是元素在ve中的索引 unordered_map<int, int> ma; RandomizedSet() { } bool insert(int val) { // 若 val 不存在,则插入并返回true if(ma.

【蓝桥杯】2020题解

⏰总用时:130/240 🎯总分:25/150 题号 时间 结果 满分 难度 备注 1 20 ✅ 5 🌕 🔸 注意从获得一个数各个位上的数字的做法:先 ‘/’ 再 ‘%’ 2 10 ✅ 5 🌕 3 15 ❌ 10 🌕 🔹 要看清题目所给的下标是从0开始还是从1开始!🔹 注意题目要求。比如这道题只求(20, 20)的数,就只用找坐标为(a, a)的元素的规律,而不用把所有的都找出🔹 找规律要容易出错,要多算几个验证 4 10 ❌ 10 🌓 🔸 回溯 5 10 ❌ 10 🌓 🔹 用递推解决,观察递推关系式🔹 注意初始状态的确定 6 5 ✅ 15 🌕 7 60 ❌ 20 🌕 8 20 9 25 10 25 1 门牌制作 题目 小蓝要为一条街的住户制作门牌号。

【CSP】202112题解

1 序列查询 🔗 题目:序列查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include<bits/stdc++.h>using namespace std; int main(){ int n,m,a1=0,a2,sum=0; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a2); sum += (a2-a1)*(i-1); a1 = a2; } sum += (m-a2)*n; printf("%d",sum); return 0; } 2 序列查询新解 🔗 题目:序列查询新解 🔴 注意数据范围:sum 是 long long 型的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include<bits/stdc++.

【CSP】202203题解

1 未初始化警告 🔗 题目:未初始化警告 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include<bits/stdc++.h>using namespace std; int main(){ int n,k,cnt=0,x[100005],y[100005],idx[100005]={0}; cin>>n>>k; for(int i=1;i<=k;i++){ scanf("%d %d",&x[i],&y[i]); if(idx[x[i]]==0) idx[x[i]]=i; } for(int i=1;i<=k;i++){ if(y[i]!=0 && (idx[y[i]]>=i || idx[y[i]]==0)) cnt++; } cout<<cnt; return 0; } 2 出行计划 🔗 题目:出行计划 险些超时( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include<bits/stdc++.

【CSP】202206题解

1 归一化处理 🔗 题目:归一化处理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include<bits/stdc++.h>using namespace std; int main(){ int n,a[1005]; double avg=0,d=0,f; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); avg += a[i]; } avg /= n; for(int i=0;i<n;i++) d += (a[i]-avg)*(a[i]-avg); d /= n; d = pow(d,0.5); for(int i=0;i<n;i++){ f = (a[i]-avg)/d; printf("%.16f\n",f); } return 0; } 2 寻宝!大冒险! 🔗 题目:寻宝!大冒险!

【CSP】202209题解

1 如此编码 🔗 题目:如此编码 本来看到题目很迷茫来着,想着第一题怎么就那么难,后来发现题目最后有提示,看完之后醍醐灌顶, 【取模】 确实是很妙的思路,可以积累下来。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include<bits/stdc++.h>using namespace std; int main(){ int n,m,a[30],c[30],b,t=0; c[0] = 1; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); c[i] = c[i-1]*a[i]; } for(int i=1;i<=n;i++){ b = (m%c[i]-t)/c[i-1]; t += c[i-1]*b; printf("%d ",b); } return 0; } 2 何以包邮 🔗 题目:何以包邮 🔴 【动态规划】 设 s 为所有参考书价格总和,题目可以理解为在 s-x 价格内,最大化被删除的书价格总和,这样就可以把这个问题看作经典的 01背包问题 。

【CSP】202212题解

1 现值计算 🔗 题目:现值计算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include<bits/stdc++.h>using namespace std; int main(){ double i,ans,s; int n,t; cin>>n>>i>>ans; i+=1;s=i; for(int j=1;j<=n;j++){ scanf("%d",&t); ans += t*1.0/s; s*=i; } cout<<ans; return 0; } 2 训练计划 🔗 题目:训练计划 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include<bits/stdc++.

【STL】map容器用法

1 简介 🟠 map 容器中键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。 🟡 容器会自动根据各键值对的键的大小,按照既定的规则进行排序。比如 std::less<T>、std::greater<T> 规则。 🟢 键的值既不能重复也不能被修改。 🔵 使用需加上头文件:#include <map> 2 创建map容器 1️⃣ 调用 map 容器类的默认构造函数。(若默认指定了 std 命令空间,则 std:: 可省略) 1 std::map<std::string, int> map1; 2️⃣ 在创建 map 容器的同时,进行初始化。 1 std::map<std::string, int> map1 { {"语文",90} , {"数学",100} }; 3️⃣ 利用先前已创建好的 map 容器和拷贝构造函数,再创建一个新的 map 容器。 1 std::map<std::string, int> newMap(map1); 4️⃣ 通过迭代器,取已建 map 容器中指定区域内的键值对,创建并初始化新的 map 容器。 1 2 std::map<std::string, int> map1 { {"语文",90} , {"数学",100} }; std::map<std::string, int> newMap(++map1.

【STL】set容器用法

1 简介 C++ 标准函数库中的 set 可以用来存储集合,set 里面的元素都是唯一的,不可以重复,可以新增或删除元素,但不可以修改元素的值。 🔴 头文件:#include <set> 2 初始化 std::set 的初始化有三种方式:1️⃣ 以 insert() 函數新增元素 2️⃣ 直接在创建时以大括号初始化 set 内部的元素 3️⃣ 通过数组初始化。 1 2 3 4 5 6 7 8 9 10 11 12 13 // 第 1 种初始化方式 set<int> set1; set1.insert(1); set1.insert(2); set1.insert(3); // 第 2 种初始化方式 // 注意这里没有 '=' set<int> set2 {1,2,3}; // 第 3 种初始化方式 int num[] = {1,2,3}; set<int> set3(num, num+3); 3 增/删元素 std::set 若要新增、刪除元素,可以使用 insert() 和 erase() 函数。

操作系统知识总结

1 绪论 2 OS的结构和硬件支持 3 操作系统的用户接口 4 进程及进程管理 5 资源分配与调度 6 处理机调度 7 主存管理 8 设备管理 9 文件系统

数据库原理知识总结

1 绪论 2 关系数据库 3 SQL语言 4 数据库安全性 5 数据库完整性 6 关系数据理论 7 数据库设计 8 关系数据库引擎基础 9 关系数据库查询优化 10 数据库恢复技术 11 并发控制