在AI掘金中写的一题
比较基础的一道模拟题: 这里学习一下如何使用stl中强大的容器:map
map是将数据进行映射的容器,形式为<int,int>,相当于python的字典
每次操作时间复杂度为log级别
详细描述如下:
std::map 是 C++ 标准库中的一个关联容器,它以键值对(key-value pairs)的形式存储数据,允许通过键(key)快速访问与之关联的值(value)。std::map 是一种基于红黑树(自平衡二叉查找树)的数据结构,因此它支持有序存储,并能提供对元素的高效查找、插入和删除操作。
特性
-
有序存储:
std::map会自动根据键值进行排序。默认情况下,键是按升序排列的,若希望自定义排序规则,可以传入一个比较函数或仿函数来实现。例如,可以让std::map按照降序、字母倒序或其他规则来排列键值对。
-
键唯一性:
std::map中的每个键都是唯一的,意味着同一个键只能对应一个值。如果插入一个已有的键,新的值会覆盖原有值。因此,std::map是一个“键唯一,值可重复”的容器。
-
基于红黑树的实现:
- 底层实现使用红黑树,这是一种自平衡的二叉查找树。每次插入或删除元素时,红黑树会自动调整结构,以确保树的高度保持在
O(log n),因此查找、插入和删除操作的时间复杂度是对数级别。
- 底层实现使用红黑树,这是一种自平衡的二叉查找树。每次插入或删除元素时,红黑树会自动调整结构,以确保树的高度保持在
-
自动排序:
std::map会根据键的大小关系自动排序其元素。默认排序是升序排列,也就是说,如果你插入的是一系列整数,std::map会将它们按从小到大的顺序排列。如果需要按照其他方式排序,可以提供一个自定义的比较器。
-
键值对的存储:
- 每个元素都由键和值两部分组成。键用于唯一标识元素,而值则是与该键相关联的数据。通过键可以快速查找到对应的值。
-
迭代器:
std::map提供了迭代器,允许顺序访问其元素。由于元素是有序的,使用迭代器时,元素会按照键的顺序被访问。
常见操作
-
查找元素:
- 可以通过键来查找元素。在
std::map中,查找操作的时间复杂度为O(log n)。如果元素存在,查找操作返回该元素的值;如果不存在,则返回end()迭代器。
- 可以通过键来查找元素。在
-
插入元素:
- 可以通过
[]操作符或者insert方法插入新元素。如果插入的键已经存在,[]操作符会更新该键对应的值,而insert方法则不会覆盖已存在的元素。
- 可以通过
-
删除元素:
- 使用
erase方法可以根据键删除元素。删除操作的时间复杂度也是O(log n),因为std::map是基于树结构实现的。
- 使用
-
修改元素的值:
- 可以直接通过键修改值。如果键存在,则直接修改该键对应的值;如果键不存在,
[]操作符会插入一个新的键值对。
- 可以直接通过键修改值。如果键存在,则直接修改该键对应的值;如果键不存在,
-
遍历元素:
- 可以通过迭代器或范围-based for 循环遍历
std::map中的所有元素。由于std::map是有序的,遍历时元素会按照键的升序顺序返回。
- 可以通过迭代器或范围-based for 循环遍历
自定义排序
默认情况下,std::map 按照键的升序进行排序。如果需要不同的排序方式,可以提供一个自定义的比较器。比较器可以是一个函数、函数对象或者 lambda 表达式。例如,可以让 std::map 按照键的降序排列,或者按照键的某种特定规则进行排序。
使用场景
std::map 适用于需要根据键进行快速查找、插入和删除操作的场景,尤其是在以下情况下:
- 需要按键的顺序访问数据。
- 键具有唯一性,且需要通过键快速定位到对应的值。
- 需要保持元素有序,并且查找、删除、插入等操作都必须高效。
典型的应用场景包括:
- 数据库索引:存储某些实体的唯一标识符及其相关数据。
- 字典:按单词查找定义或含义,单词是唯一的键。
- 配置管理:按配置项的名称查找对应的值。
总结
std::map 是一个功能强大的容器,适用于需要按键顺序存储元素并能够高效查找、插入和删除的场景。它提供了自动排序、键唯一性和快速的查找操作,是 C++ 中非常常用的数据结构之一。
在这个题目中,可以每次记录存储的数字,最后查看每个数字出现次数是否为五次,具体应用使用上述说明即可完成。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
std::string solution(std::vector<int> nums) {
// Please write your code here
map<int,int>M;
for(auto p:nums){
M[p]++;
}
for(auto p:M){
if(p.second%5){
return "False";
}
}
return "True";
}
int main() {
// You can add more test cases here
std::cout << (solution({1, 3, 4, 5, 6, 5, 4}) == "False") << std::endl;
std::cout << (solution({1, 1, 1, 1, 2, 1, 2, 2, 2, 2}) == "True") << std::endl;
std::cout << (solution({11, 45, 49, 37, 45, 38, 3, 47, 35, 49, 26, 16, 24, 4, 45, 39, 28, 26, 14, 22, 4, 49, 18, 4, 4, 26, 47, 14, 1, 21, 9, 26, 17, 12, 44, 28, 24, 24, 10, 31, 33, 32, 23, 41, 41, 19, 17, 24, 28, 46, 28, 4, 18, 23, 48, 45, 7, 21, 12, 40, 2, 19, 19, 28, 32, 6, 27, 43, 6, 18, 8, 27, 9, 6, 6, 31, 37, 15, 26, 20, 43, 3, 14, 40, 20}) == "False") << std::endl;
return 0;
}