用异或的方法解决leetcode热题之 sigle number 问题
哈喽哈喽,大家好,我是新手小白金樽清酒。很高兴又与大家见面啦。为了提高算法的能力呀,没有任何算法的基础的我开始刷leetcode的题目呀,刚开始当然是挑简单的刷咯,但是呀,看似是简单的题目也难倒了我,来让我们来一起看一看这道题目吧!!!!!!
题目描述
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入: nums = [2,2,1]
输出: 1
示例 2 :
输入: nums = [4,1,2,1,2]
输出: 4
示例 3 :
输入: nums = [1]
输出: 1
提示:
1 <= nums.length <= 3 * 104-3 * 104 <= nums[i] <= 3 * 104- 除了某个元素只出现一次以外,其余每个元素均出现两次。
补充知识点 异或运算
相信很多小白小伙伴们和我一样第一次听说异或运算这个东西。那么什么是异或运算呢?诶,别急它有这么三点性质。
-
- 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
-
- 任何数和其自身做异或运算,结果是 0,即 a⊕a=0.
诶,到这里有很多小伙伴会问了,知道这两点性质有什么用呢,我还是不会解这道题呀?最重要的一点性质来啦。
- 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
根据这条性质,我们无数多个数进行异或运算是不是相同的数抵消了,只剩下我们单着的那个数,完美找到答案。完结撒花。
解题思路来自:leetcode 官方
解题代码
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
var ret=0;
for(let num of nums)
{
ret^=num;
}
return ret;
};
看是不是很简单呀,但是要注意哦,'^'这个符号就是异或运算的符号,还有我们的循环里面let num of nums 是将nums里面的数全都遍历哦。
结语
好啦,这道题目我们就这样解完啦!实际上只要知道异或这个运算符,这道题基本上就没有任何难度啦。 但是身为小白的我确实是不知道嘞,这点我承认,学到老活到老啦。人生的路上不缺美丽的风景,不缺陪伴在身边的人,最重要的是也不能缺少虚怀若谷的心和对事物的热爱与激情。还没有刷过leetcode的小伙伴赶快刷起来吧,即使刚开始很难。