一个整型数组里除了两个数字以外,其余的数字都出现了两次。请写程序找出这两个只出现一次的数字。数组
咱们知道,两个相同的数字异或的结果等于0,因此利用这个性质将数组中全部的数字异或,求得的结果,就是两个只出现一次数字异或的结果。并且这两个数字异或的结果确定不为0,或者说结果数字二进制表示必定有一位为1,咱们以第一个为1的位置做为区分数组中数字的条件,这样便能将两个数字分到两个数组中,再分别异或每个数组中的数字,最后的结果即是这两个只出现了一次的数字。spa
C++code
class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { if(data.size() == 0) return; int flag = data[0]; for(int i = 1; i < data.size(); ++i){ flag ^= data[i]; } int d = 1; while((flag & d) == 0){ d = d << 1; } *num1 = *num2 = 0; for(int i = 0; i < data.size(); ++i){ if((data[i] & d) != 0){ *num1 ^= data[i]; } else{ *num2 ^= data[i]; } } } };
Javablog
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { public void FindNumsAppearOnce(int [] array, int num1[] ,int num2[]) { if(array == null || array.length == 0) return; int flag = 0; for(int i : array) flag ^= i; int d = 1; while((flag & d) == 0) { d = d << 1; } for(int i : array) { if((i & d) == 0) { num1[0] ^= i; } else { num2[0] ^= i; } } } }