Я бы попробовал рекурсию.
Есть n цифр с k из них 1 с. Другой способ увидеть это - последовательность k + 1 временных интервалов с n-k 0, распределенными среди них То есть (цикл 0 с последующим 1) k раз, затем с последующим циклом 0 с. Любой из этих прогонов может иметь нулевую длину, но общая длина должна быть n-k.
Представьте это как массив из k + 1 целых чисел. Преобразовать в строку в нижней части рекурсии.
Рекурсивный вызов глубины n-k, метод, который увеличивает один элемент массива перед рекурсивным вызовом, а затем уменьшает его, k + 1 раз.
На глубине n-k выведите строку.
int[] run = new int[k+1];
void recur(int depth) {
if(depth == 0){
output();
return;
}
for(int i = 0; i < k + 1; ++i){
++run[i];
recur(depth - 1);
--run[i];
}
public static void main(string[] arrrgghhs) {
recur(n - k);
}
Прошло много времени с тех пор, как я создал Java, поэтому в этом коде, возможно, есть некоторые ошибки, но идея должна работать.