只出现n次的数字(I-II-III…)总结
LeetCode中「只出现n次的数字…」题有以下几题:
题意分别是:
- 题136给定非空整数序列,只有一个元素(A)只出现一次,其他元素都出现两次,找出出现一次的元素.
- 题137给定非空整数序列,只有两个元素(A,B)只出现一次,其他元素都出现两次,找出这两个出现一次的元素.
- 题260给定非空整数序列,只有一个元素(A)只出现一次,其他元素都出现三次,找出出现一次的元素.
题解分别是:
- 题136,对整个序列进行异或,相同的元素都被抵消,异或结果即为A;
- 题137,受题136解法启发,关键点也是采用异或解题,对序列整体做一次异或,异或结果即为A和B的异或,既然A和B不相同,那么只有有一个bit位不同,那么异或结果中任何一个为1的位即可作为区分标志,以此为标志将序列分为两组,即可将题137分解为两个题136来解;
- 题260,前两次的解法在此题中不再奏效,因为三次异或的结果依然是数本身。换个思路,我们先讨论32位整数res的第i位(右->左)情况,res(i)由序列每个元素的第i位决定,那么我们可以将第i位取出来,相加,然后对3取余,那么运算结果即为元素A对此位的贡献.
总结:
题137涉及两个对象,题136和题260涉及一个对象,但是我们做完题260后,应该能找到此类题位运算的通解,即直接对对应bit位进行加和运算,这样出现2次,3次乃至4次…N次的问题都可解,即取余(%)消除出现N次的数,剩下的结果即为出现一次的数,然后找出一次的数,即可转化和分解研究对象,解n个研究对象的题。
——————————————
参考资料:
https://www.cnblogs.com/grandyang/p/4263927.html