编写算法需要帮助

时间:2010-08-07 16:48:38

标签: algorithm random

以下是对问题的描述

给定一个整数N,写一个函数,该函数返回一个大小为N的整数数组,包含随机顺序中从1到N的数字。从1到N的每个数字必须出现一次,不得重复。

  • 算法的运行时间是多少?
  • 您的算法可以改进吗?

例如:如果给出数字4,则输出必须生成类似4213,2413,3124等的内容。

无效输出将是1123,4444,244。

任何解决问题的想法?

3 个答案:

答案 0 :(得分:4)

是的,这是家庭作业。我刚刚在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;
}

答案 1 :(得分:3)

这是一个提示:查看Fisher-Yates洗牌的内容。

答案 2 :(得分:3)

你正在做的是改组整数数组。

以下是 Knuth shuffle 的解释。