unordered系列容器OJ

目录

1、unordered系列容器

2、unordered系列容器OJ

1、重复n次的元素

2、两个数组的交集I

3、两个数组的交集II

4、存在重复元素

5、两句话中不常见的单词


1、unordered系列容器

在C++标准库中,unordered系列容器是基于哈希表实现的,

用于存储唯一键(对于unordered_set)或键值对(对于unordered_map),

其中键具有唯一性。与mapset这类基于红黑树的容器相比,哈希表能够提供平均时间复杂度为O(1)的快速访问性能,不过在最坏情况下可能退化到O(n)。

主要的unordered系列容器包括:

unordered_map: 一个关联容器,包含键值对,键是唯一的。通过键可以快速访问对应的值。

unordered_multimap: 一个关联容器,包含键值对,但键可以重复。即一个键可以对应多个值。

unordered_set: 一个集合容器,包含唯一的元素。

unordered_multiset: 一个集合容器,元素可以重复

主要特点:

无序性:这些容器中的元素不会按任何特定顺序存储,因而不能像有序容器那样进行范围查询。

快速访问:提供了非常快速的访问能力,平均情况下时间复杂度为O(1)。

自定义哈希函数:用户可以提供自定义的哈希函数来改善元素的分布,从而提升性能。

键的唯一性(对于unordered_setunordered_map:保证了每个键的唯一性。

键的非唯一性(对于unordered_multisetunordered_multimap:允许键重复,实现一键多值的存储。

unordered系列容器适用于以下场景:

当需要快速查找、插入和删除元素时。

当元素的顺序不重要时。

当不需要对元素进行范围查询时。

需要注意的是:

1、因为容器内部是无序的,所以遍历这些容器得到的元素顺序是不确定的。

2、当哈希表的负载因子(元素数量/桶数量)过高时,性能可能会下降。因此,适时地调整哈希表的大小是很重要的。

3、在使用自定义类型作为键时,需要确保提供有效的哈希函数和相等判断函数。

2、unordered系列容器OJ

1、重复n次的元素

给你一个整数数组 nums ,该数组具有以下属性:

  • nums.length == 2 * n.
  • nums 包含 n + 1 个 不同的 元素
  • nums 中恰有一个元素重复 n 次

找出并返回重复了 n 次的那个元素。

思路:

元素出现了n次,所以元素每出现一次就要记录一次次数,而unordered_map就很适合,可以用唯一的key,也就是这个元素对应的值不断++,将所有元素存储到map后,再遍历里面的元素,直到找到对应value等于n次的key值,就是需要求的值。

代码实现:

class Solution {
public:int repeatedNTimes(vector<int>& nums) {int n=nums.size();int k=n/2;unordered_map<int,int> m;for(auto &e:nums){m[e]++;}for(auto &e:m){if(e.second==k){return e.first;}}return -1;}
};

2、两个数组的交集I

给定两个数组 nums1 和 nums2 ,返回 它们的 交集输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

思路:

分别将nums1和nums2的元素插入s1,s2两个unordered_set容器去重,再遍历s1容器,同时在s2中查找这个遍历的元素,若存在则将其存入vector数组中返回。

代码实现:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;unordered_set<int> s1;for(int &e:nums1){s1.insert(e);}unordered_set<int> s2;for(int &e:nums2){s2.insert(e);}for(const int &e: s1){if(s2.find(e)!=s2.end()){ret.push_back(e);}}return ret;}
};

3、两个数组的交集II

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

思路:

整体思路与上题类似,不过要将交集元素返回在两数组中出现的最小次,所以我们使用unorder_map来存储元素以及出现次数,遍历第一个map,将交集元素往返回数组中存

两个pair中最小的second次。

实现代码:

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;unordered_map<int,int> m1;for(int &e:nums1){m1[e]++;}unordered_map<int,int> m2;for(int &e:nums2){m2[e]++;}for(auto &e:m1){auto tmp=m2.find(e.first);if(tmp!=m2.end()){int n=min(e.second,tmp->second);while(n--){ret.push_back(e.first);}}}return ret;}
};

4、存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

输入:nums = [1,2,3,1]
输出:true

示例 2:

输入:nums = [1,2,3,4]
输出:false

示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

思路:

因为unordered_set: 一个集合容器,包含唯一的元素。

所以我们利用insert的返回值,每插入一次使用一个变量来记录返回值,判断是否插入成功就可以直到是否存在重复元素:

所有元素都插入成功则没有重复元素

一个插入失败则存在重复元素。

实现代码:

class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s1;for(int &e:nums){auto tmp=s1.insert(e);if(!tmp.second)return true;}return false;}
};

5、两句话中不常见的单词

句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。

示例 1:

输入:s1 = "this apple is sweet", s2 = "this apple is sour"
输出:["sweet","sour"]

示例 2:

输入:s1 = "apple apple", s2 = "banana"
输出:["banana"]

思路:

需要找到在两个句子中出现一次的单词,需要将两个句子中的所有单词存到unordered_map<string,int>中,然后遍历map,将second等于1的单词都存到返回数组中。

就可以得到符合要求的值。

但是需要注意的是,首先需要使用 splitWords 函数将句子分解为单词。

实现代码:

class Solution {
public:vector<string> splitWords(string s) {vector<string> words;string word;int start = 0;// 循环遍历字符串sfor (int i = 0; i < s.length(); ++i) {// 当遇到空格时,将[start, i)范围内的子字符串作为一个单词添加到单词列表中if (s[i] == ' ') {word = s.substr(start, i - start);words.push_back(word);start = i + 1; // 更新下一个单词的起始位置}}// 处理最后一个单词word = s.substr(start);if (!word.empty()) {words.push_back(word);}return words;
}vector<string> uncommonFromSentences(string s1, string s2) {vector<string> ret,ss1,ss2;ss1=splitWords(s1);ss2=splitWords(s2);unordered_map<string,int> m;for(string&e:ss1){m[e]++;}for(string&e:ss2){m[e]++;}for(auto e:m){if(e.second==1){ret.push_back(e.first);}}return ret;}
};

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

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

相关文章

用html实现一个文章图片缩略展示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文章图片缩略展示</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class&qu…

初始《string》及手搓模拟实现《string》

目录 前言&#xff1a; 为什么学习string类&#xff1f; 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…

k8s1.28.8版本安装prometheus并持久化数据

本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题&#xff0c;可以后面删除这个策略&#x…

LangChain使用本地LLM的简单实现

所用模型&#xff1a;stable-code-instruct-3b-Q8_0.gguf 下载链接&#xff1a;bartowski/stable-code-instruct-3b-GGUF Hugging Face 详细内容请查看&#xff1a;Introduction | &#x1f99c;️&#x1f517; Langchain 目录 LangChain 代码示例 LangChain LangChain…

再生式收音机填坑记

年前踩坑再生式收音机&#xff0c;还是得找机会把坑填上&#xff0c;最终选定了K8TND的方案&#xff0c;其实与Mr. Kitchen的也基本差不多。电路图如下&#xff1a; 实物图如下&#xff1a; 实际接收效果还不错&#xff0c;但是感觉频段上哪哪都是中国之声&#xff0c;对这种…

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects&#xff08;对象的线条检测&#xff09;&#xff1a;沿给定线条执行碰撞检测并返回遭遇的首个命中&#xff0c;这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条&#xff09;的区别&#xff0c;一个通过Obje…

React系列之合成事件与事件处理机制

文章目录 React事件处理机制原生事件的事件机制事件代理&#xff08;事件委托&#xff09; 合成事件使用合成事件目的合成事件原生事件区别事件池 原生事件和React事件的执行顺序e.stopPropagation() React17事件机制的修改 React事件处理机制 react 事件机制基本理解&#xf…

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测&#xff08;完整源码…

Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

目录 前言 安装方式 编译安装 下载 解压 安装 创建软链接 yum rpm 前言 在使用 CentOS 安装软件时&#xff0c;发现安装的方式有好几种&#xff0c;有官网下载 tar 包解压&#xff0c;然后自己编译安装的&#xff0c;也有直接通过 yum 命令一键安装的&#xff0c;还有…

力扣刷题Days29-第二题-70.爬楼梯(js)

只有学习&#xff0c;没有自己的思路解题哈哈哈 1&#xff0c;题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 2&#xff0c;代码 这种解法的本质是斐波那契数列 /*** param {number} n* re…

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

Visual Studio 2022 中VLD库如何安装

GitHub链接 Release v2.5.1 KindDragon/vld 点击可执行程序进行下载 点击可执行程序进行安装 双击打开 一直点击next即可完成安装&#xff08;不用在意安装路径&#xff0c;总共不到2MB&#xff09; 如果GitHub无法打开&#xff0c;可以私信我发你安装包直接安装

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com) 参考的这个博客&#xff0c;但有一个需要注意的是&#xff0c;最新版本的flask不知道是不是更新了还是怎么了&#xff0c;他的before_first_request不见了&#xff0c;如果继…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本&#xff0c;linux主机直接选择linux-Generic即可&#xff0c;选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类&#xff0c;就是更加抽象的类&#xff0c;也就是说&#xff0c;这个类不能具体描…

NFC RC522开发记录

文章目录 一、ID卡、IC卡(M1卡、CPU卡)的区别二、RC522读写操作1. 数据读写流程三、RC522驱动代码1. RC522 与 STM32 的接线图2. RC522.c3. RC522.h4. main.c一、ID卡、IC卡(M1卡、CPU卡)的区别 ID卡 :只存储了ID号,设备识别ID号,没有算法可言,容易复制,安全性低IC卡包含了…

机器学习——最优化模型

最优化模型的概述&#xff1a; 从某种程度上说&#xff0c;我们的世界是由最优化问题组成的。每一天&#xff0c;我们的生活都面临无数的最优化问题&#xff1a;上班怎么选择乘车路线&#xff0c;才能舒服又快速地到达公司&#xff1b;旅游如何选择航班和宾馆&#xff0c;既省…

不可变集合及Stream流

若希望某个数据是不可修改的&#xff0c;就可以考虑使用不可变集合&#xff0c;以提高安全性&#xff1b;&#xff08;JKD9之后才有&#xff09; List不可变集合&#xff1a; public static void main(String[] args) {/*创建不可变的List集合"张三", "李四&q…