您的位置:首页 > 其它

52.Single Number III

2016-01-05 17:29 134 查看
Given an array of numbers
nums
,
in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given
nums = [1, 2, 1, 3, 2, 5]
, return
[3,
5]
.

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

public int[] singleNumber(int[] nums) {
int[] numR = new int[2];
int pos=0;
Arrays.sort(nums);//首先对数组进行排序
for(int i=0;i<nums.length-1;i=i+2){
if(nums[i]!=nums[i+1]){//判断当前数字与其后一个数字是否相等
numR[pos++]=nums[i];
System.out.println(pos);
i=i-1;
}
}
if(pos<2){
numR[pos] = nums[nums.length-1];
}
return numR;
}


方法二:

整个过程分为两个步骤,首先把数组中所有的元素进行异或操作,得到的异或结果肯定不为0,那么找到这个异或结果中第一个为1的位置,假如是第n位。

* 然后按照第n为是否为1将元数组中的元素分为两组。那么出现两次的元素肯定分成两组,出现一次的那两个元素肯定被分到了不同的组里。原因是:之前的异或结果

* 第n为是1,那么出现一次的那两个元素在这第n位上肯定是不同的,所以会被分到不同的组里。对于两个相同的数字进行异或操作,结果肯定是0,那么其第n位肯定是相同的,

* 要么都是1要么都是0.

* 这样问题就转化为求一个数组中那个只出现一次的元素,其他元素都是出现两次。

*

* 另外通过这个题目学到了0与其他数异或结果还是其他数

/**
* 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
* @param array
* num1,num2分别为长度为1的数组。传出参数
* @param num1 将num1[0],num2[0]设置为返回结果
* @param num2
*
* 整个过程分为两个步骤,首先把数组中所有的元素进行异或操作,得到的异或结果肯定不为0,那么找到这个异或结果中第一个为1的位置,假如是第n位。
* 然后按照第n为是否为1将元数组中的元素分为两组。那么出现两次的元素肯定分成两组,出现一次的那两个元素肯定被分到了不同的组里。原因是:之前的异或结果
* 第n为是1,那么出现一次的那两个元素在这第n位上肯定是不同的,所以会被分到不同的组里。对于两个相同的数字进行异或操作,结果肯定是0,那么其第n位肯定是相同的,
* 要么都是1要么都是0.
* 这样问题就转化为求一个数组中那个只出现一次的元素,其他元素都是出现两次。
*
* 另外通过这个题目学到了0与其他数异或结果还是其他数。
*
*/
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int len = array.length;
if(len <= 1){
return;
}
int OrResult = array[0];//表示所有元素异或的结果
for(int i = 1;i<len;i++){
OrResult = array[i] ^ OrResult;
}
//	        System.out.println("OrResult = "+OrResult);
/*异或结果的二进制表示中首位为1的下标*/
int index1 = FindFirst1(OrResult);
for(int i = 0;i<len;i++){
if(IsBit1(array[i],index1) == true){
num1[0] = num1[0]^array[i];
//	System.out.println(array[i]);
}else{
num2[0] = num2[0]^array[i];
//	        		System.out.println(array[i]);
}
}

}
/**
* 寻找一个整数的二进制表示中,右边第一个不为1的下标。
*/
int FindFirst1(int n){
int index = 0;
while(n%2==0){
n = n>>1;
index++;
}
return index;
}
/**
* 判断一个整数的二进制表示中从右边数第n位是否为1.
*/
boolean IsBit1(int num,int n){
num = num >>n;
return (num&1) == 1 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: