Найти все перестановки кода Проблема (Java) - PullRequest
0 голосов
/ 18 августа 2011

Я написал этот код, чтобы найти все возможные перестановки некоторых чисел.Но я не хочу использовать одну цифру дважды:
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);
    }
}
}

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

tmp.remove(i) неверно. Вам нужно удалить элемент ih из tmp ... вы удаляете элемент "i". Итак, сделайте tmp.remove(in.toArray()[i]). Я думаю, что это исправит это. Например, если нулевой элемент равен 17, выполнение tmp.remove(i) удалит все нули из HashSet, а не «17».

1 голос
/ 18 августа 2011

Похоже, что Autoboxing получает вас. Когда вы вызываете метод удаления с помощью «i», я предполагаю, что «i» помещен в другой объект и, следовательно, не найден в вашем HashSet.

0 голосов
/ 28 сентября 2015

Вот гораздо более простая реализация с использованием 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);
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...