「这是我参与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]
};
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。