每日一题 -- leetCode260

158 阅读2分钟

image.png 「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

前言

每日一题,轻松解题

每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。

正文

:只出现一次的数字

难度:中等

题目要求:

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

分析题目:

只需要判断数组中不存在相同元素就可以了

举个例子

输入: nums = [1,2,1,3,2,5]
输出: [3,5]
解释: [5, 3] 也是有效的答案。

:解题

理清思路:

方法一:

使用最愚蠢的方式,就是将数组中每一个元素记录出现的次数,再获取次数出现一次的就是唯一的元素了

方法二:

我们可以使用一个哈希映射统计数组中每一个元素出现的次数。 在统计完成后,我们对哈希映射进行遍历,将所有只出现了一次的数放入答案中。

方法三:

这道题目值得熟练掌握
异或性质:
0 ^ a = a
a ^ a = 0
全部数字的异或,得到的是这两个不同的数的异或结果,那我们就知道了他们哪些位是不同的,根据这个不同将所有数字分成两组重新异或。

编辑代码:

方法一:

function singleNumber(arr) {
    const result = {}
    const res = []
    for (let i = 0; i < arr.length; i++) {
        result[arr[i]] = result[arr[i]] ? result[arr[i]] + 1 : 1
    }
    for (let i in result) {
        if (result[i] == 1) {
            res.push(i)
        }
    }
    return res
}

先创建一个对象来存放数组中元素出现的次数,key = 元素,value = 次数,然后再遍历对象,判断value = 1的存放的数组中,最后输出数组。

方法二:

var singleNumber = function(nums) {
    const freq = new Map();
    for (const num of nums) {
        freq.set(num, (freq.get(num) || 0) + 1);
    }
    const ans = [];
    for (const [num, occ] of freq.entries()) {
        if (occ === 1) {
            ans.push(num);
        }
    }
    return ans;
};

方法三:

var singleNumber = function(nums) {
    let diff = 0;
    for(const num of nums)
        diff ^= num;
    diff &= -diff;
    let ans1 = ans2 = 0;
    for(const num of nums){
        if((num & diff) > 0)
            ans1 ^= num;
        else
            ans2 ^= num;
    }
    return [ans1, ans2]
};

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。