【算法-初级-数组】只出现一次的数字(JavaScript实现)
博客说明
文章所涉及的部分资料来自互联网整理,当然还有自己个人的总结和看法,分享的目的在于共建社区和巩固自己。引用的资料如有侵权,请联系本人删除!幸好我在,感谢你来!
算法说明
语言只是实现算法的一种手段,思路才是最为重要的。
如果有多种解法的话,只选一种语言作为解答对比。
如果单独将某一种算法的话,会以多种语言实现,对比语言的特性。
😎因为多对多的话,篇幅会拉的比较大,影响观看体验!
题目
地址
题目说明
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1
输入: [2,2,1]
输出: 1
示例 2
输入: [4,1,2,1,2]
输出: 4
思路
哈希表
思路
看到重复的元素一下想到了哈希表。将哈希表里面已存在的直接删掉,最后只会保留一个已存在一次的。
JavaScript
注意js在set的取值,通过遍历来获取。
代码
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
const set = new Set();
const n = nums.length;
let res;
for (let i = 0; i < n; i++) {
if(set.has(nums[i])) {
set.delete(nums[i])
} else {
set.add(nums[i]);
}
}
// js从set中取值
set.forEach((item) => {
res = item
});
return res;
};
解析
虽然通过了,但是在复杂度上还是需要提高。需要做到不使用额外空间。
异或运算
思路
思路就是想破头也没想到,看了一下大佬的,豁然开朗。现把思路复盘一下。
利用异或运算的特性,拆解需求,一个数组只有一个数是和其他数不相等,那么其他数至少出现的次数为2。所以我们可以得出一个可怕😨的结论。整个数组惊醒异或运算的结果就是那一个只出现一次的数。然后遍历数组,循环异或运算就好了。
异或运算的特性
这个很重要!
- 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
- 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
- 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
JavaScript
代码简单的让人不敢相信!
代码
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let res = 0;
const n = nums.length;
for (let i = 0; i < n; i++) {
res ^= nums[i]
}
return res;
};
效率
效率还不错!
总结
这道题的收获主要是了解异或运算,学会换一种角度思考问题。
感谢
万能的网络
公众号【归子莫】,小程序【小归博客】
如果你感觉对你有帮助的话,不妨给我点赞👍吧,持续关注也行哈!