共计 2715 个字符,预计需要花费 7 分钟才能阅读完成。
LeetCode-01- 两数之和
题目描述
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
::: tip
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
:::
解法
利用 Map
记录数组元素值和对应的下标,对于一个数 nums[i]
,判断 target - nums[i]
是否存在 Map
var twoSum = function(nums, target) {
const _length = nums.length;
const _mayMap = new Map();
for (let i = 0; i < _length; i++) {if (_mayMap.has(target - nums[i])) {return [_mayMap.get(target - nums[i]), i];
}
_mayMap.set(nums[i], i);
}
};
Map
回顾
Map
对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
new Map([iterable])
Iterable
可以是一个数组或者其他 iterable
对象,其元素为键值对(两个元素的数组,例如:[[1, 'one'],[2, 'two']]
)。每个键值对都会添加到新的 Map
。null
会被当做 undefined
。
Objects
和 maps
的比较
Objects
和 Maps
类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。
因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps
使用。
不过 Maps
和 Objects
有一些重要的区别,在下列情况里使用 Map
会是更好的选择:
一个 Object
的键只能是字符串或者 Symbols
,但一个 Map
的键可以是任意值,包括函数、对象、基本类型。
Map
中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map
对象是按插入的顺序返回键值。
可以通过 size
属性直接获取一个 Map
的键值对个数,而 Object
的键值对个数只能手动计算。
Map
可直接进行迭代,而 Object
的迭代需要先获取它的键数组,然后再进行迭代。
Object
都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
虽然 ES5
开始可以用 map = Object.create(null)
来创建一个没有原型的对象,但是这种用法不太常见。
Map
在涉及频繁增删键值对的场景下会有些性能优势。
属性
Map.length
属性 length 的值为 0。
get Map[@@species]
本构造函数用于创建派生对象。
Map.prototype
表示 Map
构造器的原型。允许添加属性从而应用于所有的 Map
对象。
所有的 Map 对象实例都会继承 Map.prototype。
Map.prototype.constructor
返回一个函数,它创建了实例的原型。默认是 Map
函数。
Map.prototype.size
返回 Map
对象的键 / 值对的数量。
Map.prototype.clear()
移除 Map 对象的所有键 / 值对。
Map.prototype.delete(key)
如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false
Map.prototype.entries()
返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。
Map.prototype.forEach(callbackFn[, thisArg])
按插入顺序,为 Map 对象里的每一键值对调用一次 callbackFn 函数。如果为 forEach 提供了 thisArg,它将在每次回调中作为 this 值。
Map.prototype.get(key)
返回键对应的值,如果不存在,则返回 undefined。
Map.prototype.has(key)
返回一个布尔值,表示 Map 实例是否包含键对应的值。
Map.prototype.keys()
返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的键。
Map.prototype.set(key, value)
设置 Map 对象中键的值。返回该 Map 对象。
Map.prototype.values()
返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的值。
Map.prototype[@@iterator]()
返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。
例子
var myMap = new Map();
var keyObj = {},
keyFunc = function () {},
keyString = "a string";
// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键 keyObj 关联的值");
myMap.set(keyFunc, "和键 keyFunc 关联的值");
myMap.size; // 3
// 读取值
myMap.get(keyString); // "和键'a string'关联的值"
myMap.get(keyObj); // "和键 keyObj 关联的值"
myMap.get(keyFunc); // "和键 keyFunc 关联的值"
myMap.get("a string"); // "和键'a string'关联的值"
// 因为 keyString === 'a string'
myMap.get({}); // undefined, 因为 keyObj !== {}
myMap.get(function() {}) // undefined, 因为 keyFunc !== function () {}
传递数据
let valuesMap = new Map();
class payserviceclass {constructor() {}
getItem(key) {const stringKey = String(key);
if (valuesMap.has(key)) {return valuesMap.get(stringKey);
}
return null;
}
setItem(key, val) {return valuesMap.set(String(key), val);
}
clear() {return valuesMap.clear();
}
}
const payservice = new payserviceclass();
export default payservice;
https://developer.mozilla.org…