Ich habe versucht, in Java eine Kombination zu implementieren, die verschiedene r aus n verschiedenen herausnimmt. Ich habe Implementierungen gesehen, die so viele Schleifen wie r, Ich dachte über verschiedene Dinge nach, damit es in Ordnung wäre, wenn sich die Teile ändern würden.
Der folgende Code ist so ausgelegt, dass er 3 von 5 nimmt.
import java.util.ArrayList;
import java.util.List;
public class Trial {
public static void main(String[] args) {
Trial me = new Trial();
me.exec(args);
}
public void exec(String[] args) {
//Array von Zeichenfolgen
String[] strArray = new String[] { "a", "b", "c", "d", "e" };
//Holen Sie sich die Kombination
String[][] combinations = getCombinations(strArray, 3);
//Ergebnisausgabe
for (String[] combination : combinations) {
for (String str : combination) {
System.out.print(" " + str);
}
System.out.println();
}
}
private String[][] getCombinations(String[] strArray, int selectCount) {
//Liste für Verpackungsergebnisse
List<String[]> list = new ArrayList<>();
//Ich benutze es ein wenig, also behalte ich es in einer Variablen
int len = strArray.length;
//Finden Sie den Maximalwert in Binär aus der Länge des Arrays.
int dec = 0;
for (int i = 0; i < len; i++) {
dec += Math.pow(2, i);
}
//Dekrement vom Maximalwert.
for (int num = dec; 0 < num; num--) {
//Machen Sie es zu einer Zeichenfolge mit binärer Notation. (0 ist nicht gefüllt)
String bin = Integer.toBinaryString(num);
if (!isCombination(bin, selectCount)) {
//Ignorieren Sie, wenn die Anzahl der Einsen nicht mit der Auswahl übereinstimmt.
continue;
}
int j = bin.length() - 1;
int tmplen = len - bin.length();
String[] combination = new String[selectCount];
int idx = selectCount - 1;
for (int i = len - 1; tmplen <= i; i--) {
if (bin.charAt(j--) == '1') {
combination[idx--] = strArray[i];
}
}
list.add(combination);
}
return list.toArray(new String[0][0]);
}
private boolean isCombination(String str, int selectCount) {
int sum = 0;
for (int i = 0; i < str.length(); i++) {
sum += Character.getNumericValue(str.charAt(i));
}
if (sum == selectCount) {
return true;
}
return false;
}
}
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
Die Kombination von 5 bis 3 ist 5! / (2! * (5-2)!) = 10 Vielleicht passt es.
Ich denke, es gibt viel Raum für Verbesserungen, wenn man die Leistung betrachtet und mit großen Zahlen umgeht.
das ist alles
Recommended Posts