首页 > 其他分享 >代码随想录day6● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和

代码随想录day6● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和

时间:2022-09-29 10:59:34浏览次数:76  
标签:容器 set map int 随想录 202 键值 unordered 两数

 哈希表理论基础 

C++ STL无序容器种类

和关联式容器一样,无序容器只是一类容器的统称,其包含有 4 个具体容器,分别为 unordered_map、unordered_multimap、unordered_set 以及 unordered_multiset。

表 1 对这 4 种无序容器的功能做了详细的介绍。

表 1 无序容器种类
无序容器功能
unordered_map  存储键值对 <key, value> 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。
unordered_multimap 和 unordered_map 唯一的区别在于,该容器允许存储多个键相同的键值对。
unordered_set 不再以键值对的形式存储数据,而是直接存储数据元素本身(当然也可以理解为,该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。另外,该容器存储的元素不能重复,且容器内部存储的元素也是无序的。
unordered_multiset 和 unordered_set 唯一的区别在于,该容器允许存储值相同的元素。

unordered_map经典用法:

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
    //创建空 umap 容器
    unordered_map<string, string> umap;
    //向 umap 容器添加新键值对
    umap.emplace("Python教程", "http://c.biancheng.net/python/");
    umap.emplace("Java教程", "http://c.biancheng.net/java/");
    umap.emplace("Linux教程", "http://c.biancheng.net/linux/");
    //输出 umap 存储键值对的数量
    cout << "umap size = " << umap.size() << endl;
    //使用迭代器输出 umap 容器存储的所有键值对
    for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
        cout << iter->first << " " << iter->second << endl;
    }
    return 0;
}

 在 unordered_map 容器模板中,提供了表 1 所示的成员方法,可用来获取指向指定位置的前向迭代器。

表 1 C++ unordered_map迭代器相关成员方法
成员方法功能
begin() 返回指向容器中第一个键值对的正向迭代器。
end()  返回指向容器中最后一个键值对之后位置的正向迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。
find(key) 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。
equal_range(key) 返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中键为 key 的键值对所在的范围。

unordered_map相关成员迭代器的用法:

 1 #include <iostream>
 2 #include <string>
 3 #include <unordered_map>
 4 using namespace std;
 5 int main()
 6 {
 7     //创建 umap 容器
 8     unordered_map<string, string> umap{
 9         {"Python教程","http://c.biancheng.net/python/"},
10         {"Java教程","http://c.biancheng.net/java/"},
11         {"Linux教程","http://c.biancheng.net/linux/"} };
12     cout << "umap 存储的键值对包括:" << endl;
13     //遍历输出 umap 容器中所有的键值对
14     for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
15         cout << "<" << iter->first << ", " << iter->second << ">" << endl;
16     }
17     //获取指向指定键值对的前向迭代器
18     unordered_map<string, string>::iterator iter = umap.find("Java教程");
19     cout <<"umap.find(\"Java教程\") = " << "<" << iter->first << ", " << iter->second << ">" << endl;
20     return 0;
21 }

242. 有效的字母异位词

 1 class Solution {
 2 public:
 3     bool isAnagram(string s, string t) {
 4         //创建数组用于记录字母出现的次数
 5         int res[26] = {0};
 6         //记录s中每个字母出现的次数
 7         for (int i = 0; i < s.size(); i++){
 8             res[s[i] - 'a']++;
 9         }
10         //减去t中每个字母出现的次数
11         for (int i = 0; i < t.size(); i++){
12             res[t[i] - 'a']--;
13         }
14         //判断每个字母的次数是否为零
15         for (int i = 0; i < 26; i++){
16             if (res[i] != 0){
17                 return false;
18             }
19         }
20         return true;
21     }
22 };

349. 两个数组的交集

 

 

 1 class Solution {
 2 public:
 3     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
 4         //创建result_set用于存放结果
 5         unordered_set<int> result_set;
 6         //创建num_set用于存放nums1
 7         unordered_set<int> num_set(nums1.begin(),nums1.end());
 8         //遍历nums2
 9         for (int num : nums2){
10             //判断num是否在num_set中出现过
11             if (num_set.find(num) != num_set.end()){
12                 result_set.insert(num);
13             }
14         }
15         //输出结果数组
16         return vector<int>(result_set.begin(), result_set.end());
17     }
18 };

202. 快乐数

 

 1 class Solution {
 2 public:
 3     //创建函数用于n的各个位置的数字平方求和
 4     int qiuhe(int n){
 5         int sum = 0;
 6         while(n != 0){
 7            sum  += (n % 10) * (n % 10);
 8            n = n / 10;
 9         }
10         return sum;
11     }
12 
13     bool isHappy(int n) {
14         //创建unordered_set用于存储getSum(n)的结果
15         unordered_set<int> num_set;
16         int sum = qiuhe(n);
17         while(sum != 1){
18             sum = qiuhe(sum);
19             //如果unordered_set中不存在getSum(n),则将该数字存入结果集
20             if (num_set.find(sum) == num_set.end()){
21                 num_set.insert(sum);
22             //存在则说明结果集开始循环,return false
23             } else {
24                 return false;
25             }
26         }
27         return true;
28     }
29 };

1. 两数之和

因为要通过查找数组中的值来返回下表,所以需要同时存储两个不同的元素,使用unordered_map存储

 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& nums, int target) {
 4         std::unordered_map <int, int> map;
 5         for (int i = 0; i < nums.size(); i++){
 6             //遍历当前元素,并在map中查找是否存在匹配的key
 7             auto iter = map.find(target - nums[i]);
 8             if (iter != map.end()){
 9                 return {iter->second, i};
10             }
11             //若不存在匹配的key,则将key和下表存入map
12             map.insert(pair<int, int>(nums[i], i));
13         }
14         return {};
15     }
16 };

标签:容器,set,map,int,随想录,202,键值,unordered,两数
From: https://www.cnblogs.com/zsqy/p/16736858.html

相关文章

  • 2022.9.29-周四-九月第四周
     公式化生活的,真的过够了 作词:潘云安作曲:潘云安编曲:告五人形同虚设的时间在你眼里成为了无限青春充满了不眠是为了追寻更多的明天好似无尽的灯街从不分你我......
  • VS2022/VS2019安装WinForm打包程序,Microsoft Visual Studio Installer Projects 2022
    问题:使用VS2022创建WinForm程序,完了需要打包成安装程序,这时候我去下载MicrosoftVisualStudioInstallerProjects2022插件,速度超级慢,恶心人。总算是下载下来了,我存到我......
  • visual studio 2022 因网络问题无法下载的问题
    在使用visualstudioinstaller或者在visualstudio下载andriodsdk时,明明有网络却一直无法下载成功。造成此类原因是因为微软官网的网络屏蔽,需修改本机ipv4地址的d......
  • serialportscreeen-2022-09-28
    1、点击生成时如果提示变量数超过64,如果只是在欢迎使用界面上修改每页最大配置变量数为128然后直接点击保存生成,会导致工程烧录进入出现图标偏移以及文本显示变量偏移(也就......
  • CSP 2021 J/S爆蛋记
    初赛Day?~0每天做试卷Day1AM提高题目大体和做过的题目难度差不多,所以没有特别慌。估分:\(About\)\(77\)实际:\(About\)\(77\)PM由于上午感觉进了复赛,下午随便......
  • CSP2022 J/S 游寄
    9.18A.m.自己学校考,但只能睡到7点不到,就很无语。来了好多同学,关系也不错,聊了一会天就去考试了。至于考试没什么好说的,J也就那样。P.m.上午对了一下答案,貌似\(92\)?......
  • 20220929
    20220928传送门t1牛牛的方程式思路​ 由裴蜀定理:若\(a,b\)为整数,且\(gcd(a,b)=d\),那么一定存在整数\(x,y\)使得\(ax+by=d\)成立。这样,这道题就迎刃而解了。代码也非......
  • 肖sir __新闻__2022年9 月29日___信息
    1、健全生态补偿机制,推动美丽中国建设2、国办通报表扬国务院第九次大督查3、党的二十大召开4、乡村振兴取得阶段性重大成就5、人设部:增设:中类和小类职业6、俄罗斯和......
  • 2022/9/27 整合thymeleaf渲染首页
     商品首页与商品检索页开发1.微服务架构1)动静分离用户访问所有请求,全部先访问nginx,nginx做为反向......
  • 2022“杭电杯”中国大学生算法设计超级联赛(3)-K - Taxi -曼哈顿+二分
    K-Taxi题意开始给你n个点每个点的坐标\((x_i,y_i)\),权值\(w_i\),一共q次询问,每次询问给你一个点(qx,qy),求该点到前面某个点的距离的最大值是多少。两个点之间的距离定义......