版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dengminghli/article/details/76767742
问题描述:在一个长度为100的数组里随机插入100个1-100内的随机数,要求随机数不能重复,并且不能使用其他类型的数据结构。仅可以使用数组完成。
解法1:
/**
* 解题思路:
* 随机生成1-100里面的数字z
* .
* 判断是否在数组里面存活
* 如果存活,则抛弃
* 如果不存活,添加进数组中
* 问题:效率不高
* 推荐指数:**
* */
private static void putRandomNumberIntoArrays(int[] arrays) {
int count =0;
do {
int randomNumber = new Random().nextInt(100)+1;
if (!isAlive(randomNumber,arrays)) {
arrays[count++] = randomNumber;
}
} while (!(count == arrays.length));
}
/*
*判断是否存在
*/
static boolean isAlive(int number,int[] arrays){
boolean isAlive = false;
for (int i = 0; i < arrays.length; i++) {
if (number == arrays[i]) {
isAlive = true;
}
}
return isAlive;
}
这个解法应该是符合普遍人的思路了,只是这样的话会造成一个问题:当数组内的随机数越多的时候,重复的几率就会扩大,也就是需要生成更多的随机数,这使得效率十分低下,是故不推荐。但如果是在想不起其他优化的话,还是可以先参照的。下面是优化解法:
解法2:
/**
* 解题思路:
在一长度为100数组中,依次存入1-100的数字
随机选取一个下标,将其存储的值与最后一个值交换
把数组的最后一个值加入到数组中,改变下一次随机下标取值范围(-1)
避免了重复数字的出现,避免了多次的循环判断监测,优化效率,但增加内存
* 推荐指数:***
* */
private static void putRandomNumberIntoArrays(int[] arrays) {
int datalength=100;
int[] data = new int[datalength];
for (int i = 0; i < data.length; i++) {
data[i] = i+1;
}
int count = 0;
do{
int rand =new Random().nextInt(datalength--);
int tmp=data[rand];
data[rand] = data[datalength];
data[datalength] = tmp;
arrays[count++] = data[datalength];
}while(count != arrays.length);
}
}
这个算法极大程度上优化了效率问题,但也增加了内存。虽然这个内存不算很致命。但总的来说,还有可以优化的地方。
解法3:
/**
* 优化思路:
在数组内直接存放1-100的随机数,随机生成下标,将下标数值得数与可生成随机数的最大值进行交换,然后缩减随机数范围(-1)
既不新增内存,也优化了效率
* 推荐指数:****
* */
private static void putRandomNumberIntoArrays(int[] arrays) {
int datalength =arrays.length;
for (int i = 0; i < arrays.length; i++) {
arrays[i]= i+1;
}
do{
int rand =new Random().nextInt(datalength--);
int tmp=arrays[rand];
arrays[rand] = arrays[datalength];
arrays[datalength] = tmp;
}while(datalength>0);
}
}
这个算法时目前所能想到的最佳的方法了,既不增加内存,也避免了随机值重复的问题。这个和解法2的问题仅限于是否增加一个内存而已,本质上是一致的,可供参考。