一、算法示例
1、题目:题目:0-999的数组中,添加一个重复的元素,打乱后,找出这个重复元素
代码示例:
package com.zw.study.algorithm;
import java.util.*;
public class XorTest {
public static void main(String[] args) {
// 生成一个0-100的101位固定数组,之后对下标为100的值重新生成重复的随机数
Integer[] arr = new Integer[1001];
for (int x = 0; x < arr.length; x++) {
arr[x] = x;
}
Random r = new Random();
arr[1000] = r.nextInt(1000); // 0-99的随机数
System.out.println("生成的随机数是:" + arr[1000]);
// 顺序打乱
List<Integer> arrList = new ArrayList<>();
arrList.addAll(Arrays.asList(arr));
Collections.shuffle(arrList);
arr = arrList.toArray(new Integer[0]);
System.out.println();
spaceIndexMethod(arr);
}
// 空间换时间算法
private static void spaceIndexMethod(Integer[] arr) {
long startTime = System.nanoTime();
// 空间换时间
int[] newArray = new int[1001];
int result = -1;
for (int x = 0; x < arr.length; x++) {
newArray[arr[x]]++;
if(newArray[arr[x]] == 2) {
result = arr[x];
break;
}
}
System.out.println("这个重复的元素是:"+result);
long endTime = System.nanoTime();
System.out.println("空间算法共耗时:" + (endTime - startTime) + "纳秒");
}
}
运行结果:
说明:
空间换时间算法,是算法中最常见的一种,以牺牲一定空间为代价,换得时间的耗时更少。
1000个数据可能不好理解,以5个数据说明给大家理解一下上面的原理:
原始数据:0 1 2 3 4
添加重复元素后:0 1 2 3 4 2
打乱后如:3 2 1 4 2 0
生成空间数组0 0 0 0 0 实际上就是记录重复值出现的次数(第1个记录0的出现次数,第2个记录1的出现次数,第3个记录2的出现次数…)
如下图可以看到,因为出现了两次2,就会在新数组的第3个位置进行两次自增,而不重复的值,只会在自己值对应的下标处自增1次。所以可以新数组值为2的地方,下标就是数组1中的重复值。
学海无涯苦作舟!!!