一个整型数组里除了两个数字之外,其他的数字都出现了两次。
数组中只出现一次的数字
http://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811
- 记数组中存在的唯一的两个数字分别为a,b
- 首先以二进制的角度去看所有的数字,每一位均为0,1组成
- 对所有数字进行个位上的异或,成对相同的数字结果为0,每一位上都这样异或依次,所以最终每一位上存在1的则必然是因为a,b在这一位上不同
- 根据最终结果上存在‘1’的这一位,将原数组分为两组,一组‘1’,一组‘0‘,
- 两组数字再分别异或,最终两个结果就是a,b;
class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { int num=0; for(int i=0;i < data.size();i++){ num^=data[i];//所有数异或,结果为不同的两个数字的异或 } int count=0;//标志位,记录num中的第一个1出现的位置 for(;count < data.size();count++){ if((num&(1<<count))!=0){ break; } } int num_1 = 0; int num_2 = 0; for(int i=0; i < data.size(); i++){ if((data[i]&(1<<count))==0){//标志位为0的为一组,异或后必得到一个数字(这里注意==的优先级高于&,需在前面加()) num_1^=data[i]; }else{ num_2^=data[i];//标志位为1的为一组 } } *num1 = num_1; *num2 = num_2; } };