思路
- Set<integer> 集合</integer>
- 异或运算,异或有交换律,异或的结果是两个不同的数异或得到,通过这个数的二进制中某个1,对整个数组进行分组。分组之后可以转换为求一个数组中只有一个数字是1位的场景。
代码
Set集合
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 import java.util.*; public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { Set<Integer> arr=new HashSet<>(); for(int i=0;i<array.length;i++){ if(!arr.contains(array[i])){ arr.add(array[i]); }else{ arr.remove(array[i]); } } int p=0; for(Integer i:arr){ if(p==0){ num1[0]=i; p++; }else{ num2[0]=i; } } } }
异或运算
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int res=0; for(int i=0;i<array.length;i++){ res=res^array[i]; } int p=0; while((res&1)!=1){ res=res>>1; p++; } int res1=0,res2=0; for(int i=0;i<array.length;i++){ if(((array[i]>>p)&1)==1){ res1=res1^array[i]; }else{ res2=res2^array[i]; } } num1[0]=res1; num2[0]=res2; } }