05 极客大学-算法训练营-覃超-第五课.pdf

实战题目 / 课后作业

  • 有效的字母异位词(亚马逊、Facebook、谷歌在半年内面试中考过)

    1. /**
    2. * 计算每个字符串字母出现的次数
    3. * 1、遍历字符串s, 声明一个map, 以字母为key, 字母出现的次数为val, 统计每个字符串出现的次数
    4. * 2、遍历字符串t, 如果字符号中的字母在map中,则对应的次数减1
    5. * 3、遍历map中的values,判断val 是否为0
    6. */
    7. var isAnagram = function (s, t) {
    8. if (s.length !== t.length) {
    9. return false;
    10. }
    11. let strMap = new Map();
    12. for (let i = 0; i < s.length; i++) {
    13. strMap.set(s[i], (strMap.get(s[i]) || 0) + 1);
    14. strMap.set(t[i], (strMap.get(t[i]) || 0) - 1);
    15. }
    16. return [...strMap.values()].every((item) => {
    17. return item === 0;
    18. });
    19. };
  • 字母异位词分组(亚马逊在半年内面试中常考)

    1. // /**
    2. // * 排序法
    3. // * 1、声明一个map, 遍历数组
    4. // * 2、以item的排序作为map 的key, 如果后续的item 是当前key的字母异位词,存放到当前key 的数组中
    5. // * 3、如果不是,另存为一个map 的key
    6. // * 4、遍历map的values
    7. // */
    8. var groupAnagrams = function (strs) {
    9. let strMap = new Map();
    10. for (let str of strs) {
    11. let key = str.split("").sort().join("");
    12. if (strMap.has(key)) {
    13. let arrVal = strMap.get(key);
    14. arrVal.push(str);
    15. strMap.set(key, arrVal);
    16. } else {
    17. strMap.set(key, [str]);
    18. }
    19. }
    20. return [...strMap.values()];
    21. };
  • 两数之和(亚马逊、字节跳动、谷歌、Facebook、苹果、微软、腾讯在半年内面试中常考)

Set & WeakSet

Set

ES6 新增的数据结构,类似于数组,但成员的值都是唯一的

操作方法

3、哈希表、映射、集合的实现与特性 - 图1

遍历方法

3、哈希表、映射、集合的实现与特性 - 图2

WeakSet

  • weakSet的成员只能是对象 ```javascript const a = [[1,2],[3,4]]; const ws = new WeakSet(a) // 正确🙆 WeakSet([1,2],[3,4])

const b = [1,2] const ws2 = new WeakSet(b) // 错误🙅 Uncaught TypeError: Invalid value used in weak set

// 成为WeakSet的成员的是a数组的成员,而不是a数组本身,这意味着,数组的只能是对象

  1. - weakSet中的对象都是弱引用 ==> 垃圾回收机制不考虑存放在weakSet中的对象引用 ==> **WeakSet不可遍历**
  2. **
  3. ---
  4. <a name="iqHTd"></a>
  5. ## Map & WeakMap
  6. <a name="lNLtR"></a>
  7. ### Map
  8. > 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串(对象的键需要是字符串)
  9. ```javascript
  10. // 只有对同一个对象的引用,Map结构才将其视为同一个键
  11. const map = new Map()
  12. map.set(['a'], 555)
  13. map.get(['a']) // undefined
  14. --------------------------------------
  15. let arr = ['a']
  16. const map2 = new Map()
  17. map2.set(arr, 'arrVal')
  18. ma2.get(arr) // arrVal

操作方法

3、哈希表、映射、集合的实现与特性 - 图3

遍历方法

3、哈希表、映射、集合的实现与特性 - 图4

WeakMap

  • WeakMap只接受对象作为键名(null除外)不接受其他类型的值作为键名 ```javascript const map = new WeakMap() map.set(null, ‘null’) // Uncaught TypeError: Invalid value used as weak map key

map.set(Symbol(), ‘symbol’) // Uncaught TypeError: Invalid value used as weak map key ```

  • WeakMap的键名所指向的对象不计入垃圾回收机制 ==> 垃圾回收机制不考虑存放在WeakMap中的对象引用 ==> WeakMap不可遍历