标签:
题目如下:一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
1 int singleNumber3(int a[], int length){ 2 int ones = 0; 3 int twos = 0; 4 int not_three = 0; 5 for(int i=0;i<length;i++){ 6 twos |= ones&a[i]; 7 ones^=a[i]; 8 not_three = ~(ones&twos); 9 ones = ones¬_three; 10 twos = twos¬_three; 11 } 12 return ones; 13 }
ones最后的结果是代表出现(mod3=1)次的数,twos代表出现(mod3=2)此的数。
解析:
twos |= ones&a[i];ones出现一次,那么ones&a[i]中的bit位为1表示当前出现两次,与历史信息相或,那么twos中出现的bit位为1就表示已出现两次。
not_three = ~(ones&twos),ones&twos中bit位为1的表示出现三次,ones代表出现一次,two代表已出现两次,相与就表示出现三次。
ones &=not_three将出现三次的清零。
同理twos&=not_three。
标签:
原文地址:http://www.cnblogs.com/zhang-wen/p/4760738.html