首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写算法所需的帮助

编写算法所需的帮助
EN

Stack Overflow用户
提问于 2010-08-07 16:48:38
回答 3查看 227关注 0票数 3

下面是这个问题的描述

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

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

例如:如果给定数字4,则输出必须生成4213、2413、3124等。

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

有什么办法解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-07 17:06:33

这里有个提示:看看费舍-耶茨洗牌是什么。

票数 3
EN

Stack Overflow用户

发布于 2010-08-07 17:54:58

是的是在家工作。我刚刚用java完成了算法的编写,但是使用Fisher-Yates洗牌似乎要高效得多。谢谢大家。下面是我的算法版本。

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2010-08-07 17:09:35

你要做的是洗牌一个整数数组。

以下是对克努斯洗牌的解释。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3431242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档