返回

两数之和--哈希方法

let hash = new Map()是 JavaScript 中使用 Map对象创建一个哈希表(Hash Table)的写法。Map是 ES6 引入的一种数据结构,用于存储键值对(key-value pairs),类似于普通对象{},但功能更强大且灵活。

  • 低于O(n^2)的写法,使用
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 /** 
  *原理:
  * 1. 遍历nums
  *	2. 通过hash.has()搜索哈希表内的对应值
  *	3. 没有对应值则存入哈希表,继续下一个数据搜索哈希表内对应值
  *	4. 搜索到对应值,终止循环
  * 例子:nums:[2,8,11,15,3,7]  target:9
  */
var twoSum = function (nums, target) {
    let hash = new Map()
    for (let i = 0; i < nums.length; i++) {
    // 首次哈希表为空,搜索不到数据
    // 如果哈希表内搜索不到nums[i]对应相加数据为target的答案,则先存入哈希表,让下个循环的nums[i]进行搜索
        if (!hash.has(target - nums[i])) hash.set(nums[i],i)
    // 哈希表搜索到答案则直接返回
        else return [hash.get(target-nums[i]), i]
    }
};

let hash = new Map(); 是 JavaScript 中使用 Map 对象创建一个哈希表(Hash Table)的写法。Map 是 ES6 引入的一种数据结构,用于存储键值对(key-value pairs),类似于普通对象({}),但功能更强大且灵活。


1. Map 的核心特性

特性 描述
键的类型任意 键可以是任何数据类型(对象、函数、基本类型等),而普通对象的键只能是字符串或 Symbol。
有序性 键值对的插入顺序会被保留,遍历时按插入顺序返回。
可直接获取大小 通过 hash.size 直接获取键值对数量,而普通对象需要 Object.keys(obj).length
高性能增删查 在频繁增删键值对时,性能通常优于普通对象。

2. 基本用法

初始化与操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 创建一个空 Map
let hash = new Map();

// 添加键值对:使用 set(key, value)
hash.set("name", "Alice");    // 键是字符串
hash.set(42, "Answer");       // 键是数字
hash.set({}, "empty object"); // 键是对象

// 获取值:使用 get(key)
console.log(hash.get("name")); // 输出 "Alice"

// 检查键是否存在:使用 has(key)
console.log(hash.has(42));     // true

// 删除键值对:使用 delete(key)
hash.delete(42);

// 清空所有键值对:使用 clear()
hash.clear();

遍历 Map

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 使用 for...of 遍历键值对
for (const [key, value] of hash) {
  console.log(key, value);
}

// 获取所有键:keys()
console.log(hash.keys());   // 输出所有键的迭代器
// 获取所有值:values()
console.log(hash.values()); // 输出所有值的迭代器
// 获取所有键值对:entries()
console.log(hash.entries());

3. 与普通对象 {} 的区别

场景 普通对象 {} Map
键的类型 仅支持字符串或 Symbol 支持任意类型(包括对象、函数等)
顺序保证 ES6 后保持插入顺序(但不绝对可靠) 严格按插入顺序遍历
大小获取 需手动计算 Object.keys(obj).length 直接通过 map.size
性能 频繁增删时性能较差 频繁增删时性能更好
继承原型链属性 可能意外继承原型链上的属性 不会继承原型链属性

4. 使用场景

  • 需要键为复杂类型(如对象、函数)时:

    1
    2
    
    const funcKey = () => {};
    hash.set(funcKey, "Function as key");
    
  • 需要保持插入顺序

    1
    2
    3
    4
    
    const orderedMap = new Map();
    orderedMap.set("second", 2);
    orderedMap.set("first", 1);
    console.log([...orderedMap.keys()]); // ["second", "first"]
    
  • 需要高效增删操作(如缓存、临时数据存储):

    1
    2
    3
    
    const cache = new Map();
    cache.set("user:123", { name: "Alice" });
    cache.delete("user:123"); // 快速删除
    
使用 Hugo 构建
主题 StackJimmy 设计