【博客54】奇妙方法解:"找数组中只出现一次的数字"

内容: 记录下之前做的一道leetcode题目,在评论区学到了一种很新奇的解法,让我实在佩服大佬们的思维。

题目:
【博客54】奇妙方法解:"找数组中只出现一次的数字"
我的解法:
【博客54】奇妙方法解:"找数组中只出现一次的数字"
题解思路:将int的32个位的每个位出现的次数叠加起来,然后因为大部分数字出现了三次,只有一个出现一次,那么将每个位出现的总次数对3求余,剩下的就是只出现一次的那个数的位了。

leetcode上大佬的解法:
【博客54】奇妙方法解:"找数组中只出现一次的数字"
一开始看不出是在干什么,但是在纸上画一下就知道了。我帮大家画出来,直接看结果。
【博客54】奇妙方法解:"找数组中只出现一次的数字"
分析:这两行代码就像是一个触发器一样,至于触发器,学过数字电路的同学应该很熟悉吧,我就不多解释了。经过这个代码,可以让一个数第一次经过时,a保留的是这个数原值,而经过三次则可以达到清0的结果。那么整个数组都经过这个触发器,其中出现三次的数字会被清0,a中余下的就是出现一次的数字。整个过程就像:00-10-01-00。这样的一个循环过程。具体的看图应该可以理解得出来这个。至于为什么需要两个数,是因为当一个数出现两次的时候,用一次的^就可以解决了。x与x异或一次,则结果为0,再异或一次则结果变为x。当时如果是出现三次呢?显然靠自己一个数只能是0,1两种状态,所以这时候如果引出2个数,则可以表示得了三种状态。是不是很奇妙呢?

感慨: 以前学过数字电路的课,一看到这个题解,瞬间就有思路了。学科有时候是可以交叉使用的,哈哈哈。

大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。