Математически у вас есть варианты 10 для первого числа, 9 для второго, 8 для третьего и 7 за 4-е. Итак, 10 * 9 * 8 * 7 = 5040 .
Программно вы можете генерировать их с помощью логики некоторых комбинаций. Использование функционального подхода обычно обеспечивает чистоту кода; то есть рекурсивно создавать новую строку, а не пытаться использовать StringBuilder или массив для изменения существующей строки.
Пример кода
Следующий код будет генерировать перестановки, без повторного использования цифр, без какого-либо дополнительного набора или карты / и т. Д.
public class LockerNumberNoRepeats {
public static void main(String[] args) {
System.out.println("Total combinations = " + permutations(4));
}
public static int permutations(int targetLength) {
return permutations("", "0123456789", targetLength);
}
private static int permutations(String c, String r, int targetLength) {
if (c.length() == targetLength) {
System.out.println(c);
return 1;
}
int sum = 0;
for (int i = 0; i < r.length(); ++i) {
sum += permutations(c + r.charAt(i), r.substring(0,i) + r.substring(i + 1), targetLength);
}
return sum;
}
}
Выход:
...
9875
9876
Total combinations = 5040
Объяснение
Извлечение этого из комментария @Rick, поскольку оно было очень хорошо сказано и помогает прояснить решение.
Итак, чтобы объяснить, что здесь происходит - это рекурсивная функция, которая принимает три параметра: список цифр, которые мы уже использовали (строка, которую мы строим - c), список цифр, которые мы еще не использовали (строка r) и целевая глубина или длина. Затем, когда используется цифра, она добавляется к c и удаляется из r для последующих рекурсивных вызовов, поэтому вам не нужно проверять, используется ли она уже, потому что вы передаете только те, которые еще не использовались.