DAY 01 异或运算应用
题目:1—1000这1000个数放在含有1001个元素的数组中,只有唯一一个元素值重复,其他均只出现一次,每个数组元素只能访问一次,设计一个算法将其找出。
METHOD 1:不用辅助存储空间
A^B=1 A^A=0 A^0=A
该数组与1-1001进行异或,则成对的数将会异或为0,该数组中重复的数出现的次数将为三个,异或为其数本身
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
import java.util.Random;
public class Day01 {
public static void main(String[] args){
int N=1001;
//构建1001长度的数组
int[] array=new int[N];
//为数组每个元素赋值
for (int i = 0; i < array.length-1 ; i++) {
array[i]=i+1;
}
//最后一个元素的值为1-1000的随机数
array[array.length-1]=new Random().nextInt(N-1)+1;
//随机下标
int index=new Random().nextInt(N);
Util.swap(array,index,array.length-1);
Util.print(array);
int x1=0;
for (int i = 1; i <=N-1; i++) {
x1=(x1^i);
}
for (int i = 0; i <N ; i++) {
x1=x1^array[i];
}
System.out.println(x1);
}
}
METHOD 2:使用辅助空间
另开辟一个数组对应的下标存储上列数组元素出现的次数,依次遍历这个新数组,数组对应的值为2的下标变为这个重复的数
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
import java.util.Random;
public class Day01 {
public static void main(String[] args){
int N=1001;
//构建1001长度的数组
int[] array=new int[N];
//为数组每个元素赋值
for (int i = 0; i < array.length-1 ; i++) {
array[i]=i+1;
}
//最后一个元素的值为1-1000的随机数
array[array.length-1]=new Random().nextInt(N-1)+1;
//随机下标
int index=new Random().nextInt(N);
Util.swap(array,index,array.length-1);
Util.print(array);
//另开辟一个辅助空间,存储对应数值的出现个数
int[] helper=new int[N];
for (int i = 0; i <N ; i++) {
helper[array[i]]++;
}
for (int i = 0; i <N ; i++) {
if (helper[i]==2){
System.out.println(i);
break;
}
}
}
}