一、问题描述
假设一个无序数组里有若干个正整数,范围1~100,其中有98个整数出现了偶数次,只有两个整数出现了奇数次,如何找到这2个出现奇数次的整数?
二、问题求解
把两个出现了奇数次的整数命名为A和B 。遍历整个数组,然后依次做异或运算,进行异或运算的最终结果,等同于A和B进行异或的运算结果。这个结果肯定不会为0,所以转化为二进制,肯定有一位是1 。
选定该结果中为1的某一位数组,如 000 001 10B ,我们选择倒数第二位的1,说明A和B对应的二进制位的倒数第二位是不同的。其中必定有一个整数的倒数第二位是0,另一个整数的倒数第二位是1。
根据这个结论,可以把原数组按照二进制位的倒数第二位不同,分成两个部分,一部分的倒数第二位是0,一部分的倒数第二位是1。由于A和B的倒数第二位不同,所有A和B会被分到不同的部分。这样一来,为题就转化为寻找缺失的整数的上一题的情况了。按照原先异或算法,从每一部分找出唯一的奇数次整数即可。
三、代码实现
import random
def find_missed_num_V3(arr=[]):
result=[0,0<