题意:在1-10000中随机生成100个数,1-10000已经放在数组中,要求时间和空间都要O(1)。
思路:因为空间要O(1),所以我们可以想到这一定是在原本数组的基础上操作,时间也要O(1)的话,证明我们无法Hash后再判重。所以我们可以这么想用一个指针表示目前已经生成好的随机数,那么这个指针从1开始,每次都从剩下的数中随机取一个和当前指针交换就可以完成了,自己写了代码,有错求指出来。
import java.util.ArrayList; import java.util.HashSet; import java.util.Random; import java.util.Set; public class Solution { private int[]a = new int[10000+5]; { for (int i = 1; i <= 10000; i++) a[i] = i; } private Random rand = new Random(47); public ArrayList<Integer> Rand100() { ArrayList<Integer> ans = new ArrayList<Integer>(); int index = 1; for (int i = 1; i <= 10000; i++) { int ind = index + rand.nextInt(10000-index+1); int tmp = a[index]; a[index] = a[ind]; a[ind] = tmp; ans.add(a[index]); index++; } return ans; } public static void main(String[] args) { ArrayList<Integer> list = new Solution().Rand100(); for (int i : list) System.out.println(i); Set<Integer> set = new HashSet<Integer>(list); for (int i = 1; i <= 100; i++) { if (set.contains(i) == false) { System.out.println(false); break; } } } }
时间: 2024-12-28 01:32:13