随机生成大小为100的范围是100-1000的不重复的数组
首先想到的是用Set保证不重复,如果重复就重新生成随机数。。
但是这样可能复杂度会很高,不稳定。
面试官问还有什么办法的时候,我真是毫无头绪。
一面试就智商下线 //说的好像平时在线是的
QAQ
查了下题解:生成N个不相等的随机数
第一个方法是我写的暴力 T^T
第二个就是用一个数组记录还未用到的数字 然后每次随即下标就好了 这样保证一定是不重复的
import java.util.HashSet; import java.util.Random; import java.util.Set; public class RandomArray { Random rand = new Random(); public int[] getArray1(int n, int low, int high) { int[] arr = new int[n]; Set<Integer> set = new HashSet<>(); for (int i = 0; i < n; ++i) { int x = randomInt(low, high); while (set.contains(x)) { x = randomInt(low, high); } set.add(x); arr[i] = x; } return arr; } private int randomInt(int low, int high) { return rand.nextInt(high - low + 1) + low; } public int[] getArray2(int n, int low, int high) { int[] arr = new int[n]; int length = high - low + 1; int[] notUseNum = new int[length]; // 先将要生成的数放到数组中 然后每次在数组中随机取一个 for (int i = 0; i < length; ++i) { notUseNum[i] = i + low; } for (int i = 0; i < n; ++i) { // 在数组中随即选取一个数字 int pos = rand.nextInt(length); arr[i] = notUseNum[pos]; // 把用过的删除 把最后的挪到该位置 这样保证要取的数字位置都是连续的 notUseNum[pos] = notUseNum[--length]; } return arr; } public static void main(String[] args) { RandomArray ra = new RandomArray(); int[] arr = ra.getArray1(100, 100, 1000); for (int i: arr) System.out.println(i); int[] arr2 = ra.getArray2(10, 1, 10); for (int i: arr2) System.out.println(i); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架