查找所有排列代码问题 (Java)

发布于 2024-11-30 03:58:26 字数 814 浏览 0 评论 0原文

我编写这段代码是为了查找某些数字的所有可能排列。但我不想使用一位数字两次:
123,132,213 没问题,但它会产生 122、121 等数字。
我做错了什么?

import java.util.HashSet;

public class main {

public static void main(String[] args) {        

    HashSet<Integer> l = new HashSet<Integer>();        
    for(int i=0;i<=3;i++){
        l.add(i);
    }       
    perm(l,3,new StringBuffer());

}

 static void perm(HashSet<Integer> in, int depth,StringBuffer out){             
    if(depth==0){
        System.out.println(out);
        return;
    }       

    int len = in.size();
    HashSet<Integer> tmp = in;

    for(int i=0;i<len;i++){
        out.append(in.toArray()[i]);
        tmp.remove(i);

        perm(tmp,depth-1,out);

        out.deleteCharAt(out.length()-1);
        tmp.add(i);
    }
}
}

I wrote this code to find all possible permutations of some numbers. But i dosen't want to use one digit twice:
123,132,213 are OK, but it produces numbers like 122, 121 etc.
What am i doing wrong?

import java.util.HashSet;

public class main {

public static void main(String[] args) {        

    HashSet<Integer> l = new HashSet<Integer>();        
    for(int i=0;i<=3;i++){
        l.add(i);
    }       
    perm(l,3,new StringBuffer());

}

 static void perm(HashSet<Integer> in, int depth,StringBuffer out){             
    if(depth==0){
        System.out.println(out);
        return;
    }       

    int len = in.size();
    HashSet<Integer> tmp = in;

    for(int i=0;i<len;i++){
        out.append(in.toArray()[i]);
        tmp.remove(i);

        perm(tmp,depth-1,out);

        out.deleteCharAt(out.length()-1);
        tmp.add(i);
    }
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北笙凉宸 2024-12-07 03:58:26

tmp.remove(i) 是错误的。您需要从 tmp 中删除第 i 个元素...您正在删除元素“i”。因此,执行tmp.remove(in.toArray()[i])。我认为这会解决这个问题。例如,如果第 0 个元素是 17,则执行 tmp.remove(i) 将从 HashSet 中删除所有零,而不是“17”。

tmp.remove(i) is wrong. You need to remove the ith element from tmp... you are removing the element "i". So, do tmp.remove(in.toArray()[i]). I think that will fix this up. For instance, if the zeroth element is 17, doing tmp.remove(i) will remove all zeroes from the HashSet, not "17".

一杆小烟枪 2024-12-07 03:58:26

看起来“自动装箱”正在吸引您。当您使用“i”调用删除时,我的猜测是“i”已被装箱到另一个对象,因此在您的 HashSet 中找不到。

It looks like Autoboxing is getting you. When you call the remove with 'i', My guess is that 'i' has been boxed to a different object and is thus not found in your HashSet.

冰之心 2024-12-07 03:58:26

这是使用 HashSet 的更简单的实现。我使用的是字符串,但概念保持不变。

public void printPermutations(String str){
    HashSet<String> hs = new HashSet<>();
    printPermutations("", str, hs);
}

public void printPermutations(String prefix, String end, HashSet<String> hs){
    if(end.equals(""))
        System.out.println(prefix);
    for(int i = 0; i < end.length(); ++i)
        if(hs.add(prefix + end.charAt(i))){
            printPermutations(prefix + end.charAt(i), 
                    end.substring(0,i) + end.substring(i + 1, end.length()), hs);
        }

}

Here's a much simpler implementation using a HashSet. I'm using strings but the concept remains the same.

public void printPermutations(String str){
    HashSet<String> hs = new HashSet<>();
    printPermutations("", str, hs);
}

public void printPermutations(String prefix, String end, HashSet<String> hs){
    if(end.equals(""))
        System.out.println(prefix);
    for(int i = 0; i < end.length(); ++i)
        if(hs.add(prefix + end.charAt(i))){
            printPermutations(prefix + end.charAt(i), 
                    end.substring(0,i) + end.substring(i + 1, end.length()), hs);
        }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文