由于137 和136都是使用哈希表和位运算,这里就不再对其进行介绍。

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

1.js用map构建哈希表

由于本题中每个重复的数字有三个,所以需要用map构建键值对来判断只出现一次的数字。

2.代码编写

function singleNumberTwo(nums) {
    const freq = new Map()
    for (const num of nums) {
        freq.set(num,(freq.get(num) || 0) + 1);//map.get()返回一个 Map 对象中与指定键相关联的值,如果找不到这个键则返回 undefined
    }

    let ans = 0;
    for (const [num, occ] of freq.entries()) {//entries() 方法返回一个新的包含 [key, value] 对的 Iterator 对象,返回的迭代器的迭代顺序与 Map 对象的插入顺序相同。
        if (occ == 1) {
            ans = num;
            break;
        }
    }

    return ans;

}

二、位运算-只出现一次的数字Ⅱ

1.题目分析

由于每个重复的数字都会出现三次,而只有一个数字只出现一次。通过位运算转换为二进制后将每位的数字除以三的余数即为那个只出现一次的数字

2.代码编写

function singleNumberTwo1(nums) {
    let ans = 0;
    for (let i = 0; i < 32; ++i) {
        let total = 0;
        for (const num of nums) {
            total += ((num >> i) & 1);
        }
        if (total % 3 != 0) {
            ans |= (1 << i);
        }
    }

    return ans;
}