以下是问题的描述:
给定一个整数N,编写一个函数,返回一个大小为N的整数数组,其中包含1到N的数字以随机顺序出现。每个从1到N的数字必须出现一次且不能重复。
- 你的算法的运行时间是多少?
- 你的算法可以改进吗?
例如:如果给定数字4,您的输出必须生成类似于4213、2413、3124等内容。
无效的输出将是1123、4444、244。
有什么解决问题的想法吗?
以下是问题的描述:
给定一个整数N,编写一个函数,返回一个大小为N的整数数组,其中包含1到N的数字以随机顺序出现。每个从1到N的数字必须出现一次且不能重复。
例如:如果给定数字4,您的输出必须生成类似于4213、2413、3124等内容。
无效的输出将是1123、4444、244。
有什么解决问题的想法吗?
是的,这是一份作业。我刚刚用Java编写了算法,但使用Fisher-Yates shuffle似乎更有效率。谢谢大家。下面是我的算法版本。
Collection<Integer> generateNumbers(int n) {
Collection<Integer> numbers = new HashSet<Integer>();
Random rand = new Random();
int max = 0;
int min = 0;
for(int i=0;i<n;i++){
max=(max*10)+n;
min=(min*10)+1;
}
while(numbers.size()<n){
int random = rand.nextInt(max-min+1)+min;
int temp = random;
boolean good = true;
Set<Integer> digits = new HashSet<Integer>();
while(temp>0 && good){
int reminder = temp%10;
if(reminder > 0 && reminder <= n ){
digits.add(reminder);
}else
good = false;
temp/=10;
}
if(good && digits.size() == n)
numbers.add(random);
}
return numbers;
}
HashSet
不是无序的吗?这不会打破它的作用吗? - Svante