一、前言
今天在听左神的算法课的时候,有一个知识点说的是关于异或方面的,异或其实在数电里面
提到过,就是相同的数异或的结果是0,不同数字异或结果为1;例如2^2 = 0,1^0 = 1,它的规则
是:如果两个相应的二进制位相同,则结果为0,否则结果为1。由于0和0是相同的,所以0异或0
的结果是0。
二、性质
a^b = b^a; //交换律
(a^b)^c = a^(b^c) //结合律
a^0=a
0^a = a;
三、应用
下面来看一道题目:https://leetcode.cn/problems/single-number/description/;
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那
个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
如果上述标红的语句,我相信你一定会利用哈希表存储每个元素出现的次数,然后在遍历哈希表,抛出只出现一次的数字;这里我希望你要明白哈希表的底层原理是如何实现的?分类有哪些?每一类哈希表中的元素是如何存储的?不要只知道用哈希表存储的空间复杂度为O(n),
题目要求了就是用常数空间复杂度,说明我们不能再利用额外的空间解答这个题目,
大家想象一下,下面这个表达式结果为:
1^2^1^2^4
根据异或的结合率我们知道,原来的式子可以化解成这样:
(1^1)^(2^2)^4
答案是4。为啥会出现上述结果呢?因为只要一个数字出现了偶数次,不管这个数字出现的地方是
不是连续的位置,我们都可以通过结合律和交换律把这些数字集中在一起,这些数字异或的结果就
是0,最后只剩下0^a了,这里的a就是出现次数为奇数的那个数字。
OK,假设你已经明白了上述过程,再来送一个题目:
给你一个 非空 整数数组 nums
,除了某两个元素只出现一次以外,其余每个元素均出现两次。找出
只出现了一次的元素。
嘿嘿,该如何想呢?