蓝桥杯算法题一
题目:1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将他找出来;不使用辅助空间,能否设计一个算法实现?
解法一(不使用辅助空间):A^B ^B=A;即使用一个元素X=0,与1-1000相与,之后再与该数组里的所有数进行与操作,从而实现消去不重复的数字,X等于重复的数。
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;
public class two {
public static void main(String[] args){
int N=1001;
int [] arr=new int [N];
for (int i = 0; i <N ; i++) {
arr[i]=i+1;
}
arr[arr.length-1]= new Random().nextInt(N-1);
int [] helper=new int [N];
for (int i = 0; i <N ; i++) {
helper[arr[i]]++;
}
for (int i = 0; i <N ; i++) {
if (helper[i]==2){
System.out.println(i);
}
}
System.out.println(Arrays.toString(arr));
//System.out.println(x);
}
}
相关知识:A^A=0 A^0=A
A^ B^B=A
A&0=0 A&1=A
解法二(使用辅助空间):创造大小为1000的空数组Z,遍历元素数组,将元素出现的次数存入数组Z,最后提取出现次数为2的数组下标。
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;
public class two {
public static void main(String[] args){
int N=1001;
int [] arr=new int [N];
for (int i = 0; i <N ; i++) {
arr[i]=i+1;
}
arr[arr.length-1]= new Random().nextInt(N-1);
int [] helper=new int [N];
for (int i = 0; i <N ; i++) {
helper[arr[i]]++;
}
for (int i = 0; i <N ; i++) {
if (helper[i]==2){
System.out.println(i);
}
}
System.out.println(Arrays.toString(arr));
//System.out.println(x);
}
}