一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
刷题必备数据结构,可以实现查找,计数,去重,降低时间复杂度(时间换空间等,记录一下学习内容!
学习链接
Map and Set(映射和集合) (javascript.info)
简介
数据结构介绍
- 对象 - 存储键值对 - 键为字符串
- 数组 - 存储有序集合 - 开辟连续空间
- Map - 也是键值对,和对象最大区别 - 允许任意类型的键
- Set - 同map,没有重复的键!
Map的api
- new Map()
- map.set([key, value]) - 存储数据 - 修改数据
- map.get(key) - 根据键获取 值 - **任意键,对象,数值等 **
- map.has(key) - 是否存在 - O(1)时间复杂度
- map.delete(key) - 删除
- map.clear() - 情况map - 批量删除
- map.size - 存储的个数
Map怎么比较键
- 类似 ===
- NaN 在map中是 === NaN的 - NaN作为键
Map可以链式调用
- 每次都返回map本身 - return this!!!
- 例如: 连续map.set().set()
Map迭代
- map.keys() - 遍历所有键!
- map.values() - 所有值
- map.entries() - 所有[key, value] - 通常用for of,也可以forEach
从对象创建Map
- 对象也有上面的三种遍历方式 - 都是键值对。。。
let map = new Map(Object.entries(obj)- new一个然后,内部遍历键值对
从map创建对象
let obj = Object.fromEntries(map.entries())- 比较和上面区别!- 不用new- 里面的map.entries() 可以省略 - 这个函数,里面需要一个可迭代项,map可以!
Set
Set是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次。
练习题 - leetcode 763划分字母区间
字符串
S由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
补一道leetcode题目!很好的用到了map!收藏!
通过map进行查找,
-
map记录字母 最后一次出现的下标 - map.set的时候,进行了覆盖
-
双指针,从0开始,rihgt用来记录边界,比较最后出现的位置。
-
如果right === i 说明到达边界
-
计算长度,left = i + 1,用于计算下一次的长度!
var partitionLabels = function(s)
{
// 找到每个字母的右边界。
let map = new Map();
for(let i = 0; i < s.length; i++)
{
// map中存储字母 和对应下标!字母用来查找,下标用来计算长度
// 注意这里记录的下标,是该 字母,最后出现的位置!! 覆盖掉前面的了
map.set(s[i], i);
}
// 分割!
let right = left = 0; - 双指针 - 计算左右边界!
let res = [];
for(let i = 0; i < s.length; i++)
{
// map中的值用来计算无重复值的最大长度!
// right 用来保存 + 比较!
// map.get - 获取值!
right = Math.max(right, map.get(s[i]));
if(right === i) { // 如果右边等于当前值,说明到达边界!
res.push(right - left + 1);
left = i + 1; // 修改左指针,下一次的起点!
}
}
return res;
};
总结
前面一篇new 的总结 补上!- 创建一个新的空间 + this指代! -
- 优点 - 便利性 - 实现可重用的对象创建代码。
Map和Set的总结!
这里主要介绍的是api,增删改查!
还可以转换成数组,进行排序!
我始终相信读过的书都不会白读,它总会在未来日子的某一个场合,帮助我表现的更加出色。