[路飞]_leetcode-剑指 Offer II 004-只出现一次的数字

225 阅读1分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

[题目地址] [B站地址]

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

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

示例 2:

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

提示:

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

本题解题思路如下:

  1. 由题意可知给定数组中的元素都是整数,且除了某个元素出现一次外,其他元素都出现三次,那么我们可以用一个数据结构来记录每个元素的值以及出现的次数
  2. 当出现某个元素出现三次的时候,我们将该元素删除,最后我们该数据结构中剩下的就是唯一一个只出现一次的元素的值以及对应的次数 1

那接下来我们要考虑就是采用哪种数据结构来存储元素值以及对应的次数

我们可以使用 object 来做,但是这里我们会涉及频繁的增删键值,使用 object 的话,效率不是很高

JavaScript 中有一种数据结构 Map ,它是 Object 的实例,但是相对 ObjectMap占用的内存空间更小一些,在增删操作的时候,性能会更好一点。

代码如下:

var singleNumber = function(nums) {
    const map = new Map();
    for(let i = 0;i<nums.length;i++){
        if(map.has(nums[i])){
            if(map.get(nums[i])===2) map.delete(nums[i])
            else map.set(nums[i],2)
        }
        else map.set(nums[i],1)
    }

    let ret;
    map.forEach((val,key) => {
        ret = key;
    })
    return ret;
};

至此我们就完成了 leetcode-剑指 Offer II 004-只出现一次的数字

如有任何问题或建议,欢迎留言讨论!