/*
* 0-99共100个整数,放到一个数组中,位置是随机的
* 将其中一个数37,挑出来,换成不是这个数字的另一个数45
* 有一个数字是重复的,还有一个数字是没有的
* 将这个重复的数字找出来,用最快的方式
*/
public class Demo1 {
public static void main(String[] args) {
//定义一个100长度的数组
int[] arr = new int[100];
//从1-100初始化
for (int i = 0; i <100; i++) {
arr[i]=i;
}
//把37换成45,那么这100个数中,37是没有的,45是重复的
arr[37]=45;
//打乱数组的里面的值的位置,让位置随机
changePosition(arr);
//定义一个临时数组,那么里面的初始数都是0
int[] temp = new int[arr.length];
//遍历数组arr,以arr里面的值作为临时数组temp的索引
for(int i = 0;i<arr.length;i++){
//让临时数组temp对应的值都加1 ,这时候 temp的索引是0-99,temp对应索引37位置上就是0,对应45位置上就是2
temp[arr[i]]++;
//数值是2的则重复,因为 temp的索引45位置上加了两次
if(temp[arr[i]]==2){
System.out.println(arr[i]+"重复");
}
}
}
/**
* 打算数组的顺序
* @param arr 需要打乱顺序的数组
*/
public static void changePosition(int[] arr) {
Random random = new Random();
int length = arr.length;
for(int index=length-1; index>=0; index--) {
//从0到index处之间随机取一个值,跟index处的元素交换
exchange(arr, random.nextInt(index+1), index);
}
}
/**
* 交换数组中的两个数的位置
* @param arr 需要交换位置的数组
* @param p1 被交换位置的索引
* @param p2 被交换位置的索引
*/
public static void exchange(int[] arr, int p1, int p2) {
int temp = arr[p1];
arr[p1] = arr[p2];
arr[p2] = temp;
}
} |