【JS每日一算法】🟨130.只出现一次的数字(哈希表、真值表)

214 阅读2分钟

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。 请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入: nums = [2,2,3,2]
输出: 3

示例 2:

输入: nums = [0,1,0,1,0,1,99]
输出: 99

提示:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 哈希表   TC:O(n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} nums 给定数组
 * @return {*}
 */
function hashMap(nums) {
    /**
     * 该方案采用hashMap的方式,首先遍历一次数组
     * 并利用hashMap记录数组元素出现的次数(key为
     * 数组元素,value为出现的次数),然后再遍历一
     * 次数组,找出hashMap中value为1的元素,则为
     * 只出现了一次的元素
     */
    // 记录数组元素出现的次数(key为数组元素,value为出现的次数)
    let hashMap = new Map();
    // 遍历数组元素
    nums.forEach((value) => {
        // 获得该元素已出现的次数
        let count = hashMap.get(value)
        // 更新hashMap中该元素出现的次数为count+1
        hashMap.set(value, count == undefined ? 1 : ++count)
    })
    // 遍历数组元素
    for (let value of nums) {
        // 找出找出hashMap中value为1的元素,则为
        // 只出现了一次的元素
        if (hashMap.get(value) == 1) return value
    }
}


/**
 * @description: 真值表  TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} nums  给定数组
 * @return {*}
 */
function truthTable(nums){
    /**
     * 该方案利用计算真值表的方式实现,
     * 需要一定的电子信息的基础,通过
     * 给定输入/输出设计真值表,从而得
     * 出逻辑表达式,满足该真值表,下述
     * 公式则从真值表得出。
     */
    let a = 0, b = 0;
    for (const num of nums) {
        b = ~a & (b ^ num);
        a = ~b & (a ^ num);
    }
    return b;
}