数组中数字出现的次数
题目描述
1、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
2、在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
思路分析
第1题:从头到尾依次异或数组中的每个数字,那么最终的结果就是两个只出现一次的数字的异或结果,因为其他数字都出现了两次,所以抵消了。这个结果数字的二进制至少有一位为1。在结果数字中找到第一个为1的位的位置,记为第n位。以第n位是否为1把原数组分为两个子数组。由此分别异或子数组得到最终结果。代码如下:
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int numXor=0;
for(int num:array){
numXor^=num;
}
int firstBitNum=numXor&(-numXor);
for(int num:array){
if((num&firstBitNum)==0){
num1[0]^=num;
}else{
num2[0]^=num;
}
}
}
第2题:一个数字出现三次,那么该数二进制表示的每一位(0或1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。如果某一位的和能被3整除,那么那个数对应的那一位是0,否则为1。
public int threeTimesSingleNumber(int[] nums){
int[] bitSum=new int[32];
for(int num:nums){
int bitMask=1;
for(int i=bitSum.length-1;i>=0;i--){
int bit=bitMask#
if(bit!=0)bitSum[i]+=1;
bitMask=bitMask<<1;
}
}
int result=0;
for(int i=0;i<bitSum.length;i++){
result=result<<1;
result+=bitSum[i]%3;
}
return result;
}