哈希表

一、基本概念

HashMap 数据结构为数组+链表。整体是一个数组数组每个位置是一个链表链表每个节点中的Value即我们存储的Object。

二、哈希表-只出现一次的数字

1.js用set构建哈希表

因为136题中重复的数字只会出现两次,所以在此我们可以用set集合构建hashmap。遍历数组,当set中没出现数组中的数字时添加进去,当set中有这个数字时便删去这个数字,最后返回set中仅有的元素。

2.代码编写

function singleNumber(nums) {
    let set = new Set();
    for (let num of nums) {
        if (set.has(nums)) {
            set.delete(num);
        } else {
            set.add(num)
        }
    }

    return num = Array.from(set)[0];//从类数组对象或者可迭代对象中创建一个新的数组实例
}
位运算

一、基本概念

&,按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。用于消去x的最后一位的1(x=1100,x-1=1011,x&(x-1)=1000);判断奇偶数(n为数的最后一位二进制位,n&1 ==1 => n是个奇数)

|,按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。

^,按位异或,若参加运算的两位二进制位值相同则为0,否则为1。a^a = 0, a^0 = a, a^b^a = a^a^b = 0^b = b

~,取反,是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0。

<<,左移,用来将一个数的各二进制位全部左移N位,右补0。

>>,右移,将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。

二、异或运算-只出现一次的数字

1.解题思路

利用异或运算中的a ^ a ^ b = 0 ^ b = b非常方便。

2.代码编写

function singleNumber(nums) {
    let ans = 0;
    for (const num of nums) {
        ans ^= num;
    }
    return ans;
}