一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
如果数组中只有一个不同的数,全都异或,有2个的话,想办法把这个数组分成2个子数组
例如 4 0100 6 0110 异或后为0010,将第二位是1的数分在一个子数组里,其他数分在另一个子数组里,两个子数组 组内的数都异或 剩下的就是不同的数
假如不同数是3,4
异或后为7 00111
-7 10111 符号位不变取反+1 变成11001
相与得00001
可以得到7的最低位1
Java:
1 //num1,num2分别为长度为1的数组。传出参数 2 //将num1[0],num2[0]设置为返回结果 3 public class Solution { 4 public void FindNumsAppearOnce(int [] data,int num1[] , int num2[]) { 5 int diff = 0 ; 6 for(int num : data){ 7 diff ^= num ; 8 } 9 diff &= -diff ; 10 for(int num : data){ 11 if ((num & diff) == 0){ 12 num1[0] ^= num ; 13 }else{ 14 num2[0] ^= num ; 15 } 16 } 17 } 18 }
C++:
1 class Solution { 2 public: 3 void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { 4 int diff = 0 ; 5 for(int num : data){ 6 diff ^= num ; 7 } 8 diff &= -diff ; 9 for(int num : data){ 10 if ((num & diff) == 0){ 11 num1[0] ^= num ; 12 }else{ 13 num2[0] ^= num ; 14 } 15 } 16 } 17 };