两种方式找出数组中只出现一次的数字

来源:互联网 发布:gjb软件版本说明 编辑:程序博客网 时间:2024/06/05 18:46

题目描述:(剑指offer)

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

 输入:
{1,9,7,1,2,2,3,4,5,4,5,6,7,8,8,9}
输出:
num1[0] =3
num2[0]=6‘

思路1:(借用HashSet的没有重复特性)
 step1、创建一个HashSet
 step2、遍历数组,HashSet中没有出现过的放入;出现过的,直接删除
 step3、HashSet中剩下的两个就是这两个数 
public class FindNumsAppearOnce { public static void FindNumsAppearOnce1(int [] array,int num1[] , int num2[]) { Set it =  new HashSet(); for(int i : array) { if(!it.add(i))  //没有出现过的放入,出现的,直接删除 it.remove(i); } Integer result[]=new Integer[it.size()]; it.toArray(result); num1[0] = result[0]; num2[0] = result[1];    }


思路2: (异或性质——数与自身异或为0,与0异或为自己)
 step1、由于其它数字都是成双,所以所有数全部异或在一起,则得到这两个不同数的异或结果。取第一个1为标志位
  step2、 这个标志的1,必须是:这两个数在该位必须一个为0,一个为1 
  step3、这样可以将数组分为两组,一组在该标志位为1,一组在该标志位为0,这两个不同数字分别在这两组内 
  step4、将两组内的数分别异或,得到两个结果则为这两个不同的数
public class FindNumsAppearOnce2 {public static void FindNumsAppearOnce1(int [] array,int num1[] , int num2[]){int num = 0;for(int i : array) //全部亦或,得到两个不同数的标志位num^=i;int count = 0;for(; count!= array.length; count++) //取出第一个1标志位{if((num & (1<







思路1:(借用HashSet的没有重复特性)
 step1、创建一个HashSet
 step2、遍历数组,HashSet中没有出现过的放入;出现过的,直接删除
 step3、HashSet中剩下的两个就是这两个数 

思路2: (异或性质——数与自身异或为0,与0异或为自己)
 step1、由于其它数字都是成双,所以所有数全部异或在一起,则得到这两个不同数的异或结果。取第一个1为标志位
  step2、 这个标志的1,必须是:这两个数在该位必须一个为0,一个为1 
  step3、这样可以将数组分为两组,一组在该标志位为1,一组在该标志位为0,这两个不同数字分别在这两组内 
  step4、将两组内的数分别异或,得到两个结果则为这两个不同的数
0 0
原创粉丝点击