/**
* 题设:现在有0-99,共计100个整数,各不相同,将所有数放入一个数组,随机排布,
* 数组长度100,将里面任意一个数字替换成0-99的另一个数字(唯一重复的数字)
* 问题:将这个重复的数字找出来
*/
同样的这段代码, 也可以解决01.算法设计(一)的问题。
package test6;
import org.junit.Test;
public class test6 {
@Test
public void test1(){
//组装数据
int[] arr = new int[100];
for(int i=0;i<=99;i++){
arr[i] = i;
}
//随机打乱数组的排列顺序100次。
for(int i=0;i<100;i++){
int num1 = (int) (Math.random()*100);
int num2 = (int) (Math.random()*100);
int temp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = temp;
}
//将其中的一个数,替换成另一个
int n1 = (int) (Math.random()*100);
int n2 = (int) (Math.random()*100);
if(n1==n2){//如果两个值相同, 在随机生成一次,保证题目正确
n1 = (int) (Math.random()*100);
}
arr[n1] = arr[n2];
//查看我们题目的数组是什么样的
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
/**
* 使用方案一,同样可以解决
*/
/**
* 方案二:创建一个辅助的数组空间(相同长度),里面元素全都是0
* 2.遍历原始数组,使用里面的数组作为新数组的下标,进行自加
* 如果出现多次 那么值,肯定>1
*/
//由于用的是数组,数组是需要消耗内存空间的,所以,这种方式,加快了速度, 但是消耗了内存
int[] newArr = new int[100];
for(int i=0;i<arr.length;i++){
newArr[arr[i]]++;
if(newArr[arr[i]]>1){
System.out.println("重复的数字是:"+arr[i]);
}
}
}
}
下面是原理图: