在最近的一次采访中,我被问到以下问题:
getrnd50()
使用生成 1-50 的随机数的给定方法打印 1-100的随机数。每个随机数应该只打印一次并且以随机顺序打印。不允许使用其他随机数生成器,并且不允许我更改getrnd50()
.
我想出了以下代码,它给出了正确的输出。
import java.util.Random;
public class Test {
public static void main(String[] args) {
int[] rs = new int[100];
int count = 0;
int k;
while (count != 100) {
// I decided to simply multiply the result of `getrnd50()` by 2.
// But since that would generate only even numbers,
k = getrnd50() * 2;
// I decided to randomly subtract 1 from the numbers.
// Which i accomlished as follows.
if (getrnd50() <= 25) // 25 is to half the possibilities.
k--;
// Every number is to be stored in its own unique location
// in the array `rs`, the location is `(number-1)`.
// Every time a number is generated it is checked whether it has
// already been generated. If not, it is saved in its position, printed and
// `count` is incremented.
if (rs[k-1] == 0) {
rs[k-1] = k;
count++;
System.out.print(k + " ");
}
}
}
// This is the method and i am not supposed to touch it.
static int getrnd50() {
Random rand = new Random();
return (1 + rand.nextInt(50));
}
}
虽然它在该轮中被接受,但在下一轮中,面试官告诉我这getrnd50()
是一种昂贵的方法,即使在最好的情况下,我也必须为每个生成的数字调用两次。即 1-100 次 200 次。在最坏的情况下,它将是无穷大,平均情况下是数万。他要求我优化代码,以显着改善平均情况。
当我表示无法做到时,他给了我一个提示,他说:
考虑生成新数字时生成的数字数量。例如。如果
count
变成 99,我不必打电话getrnd50()
,我可以简单地找到剩余的号码并打印出来。
虽然我理解他的漂移,但我不知道它会对我有什么帮助,所以很明显我被拒绝了。现在我很想知道答案。帮我!提前谢谢!
注意:如果有人懒得写冗长的代码,只需指出数字生成部分,其余的很容易。我们也不一定要遵循提示。