Я пытаюсь написать алгоритм next()
для вычисления следующей последовательности со следующими правилами порядка:
Все последовательности имеют длину n
и состоят из 0
s и 1
s.
Последовательность с меньшим 1
s будет перед последовательностью с большим 1
s
Последовательность с более 1
s слева будет перед последовательностью с меньшим 1
s слева среди последовательностей с таким же количеством 1
s (т. Е. Если сравнивать элемент за элементом слева направо , первый будет иметь 1
, а другой - 0
будет первым)
Результат для n=4
при вызове next()
15
раз будет be:
0000
1000
0100
0010
0001
1100
1010
1001
0110
0101
0011
1110
1101
1011
0111
1111
Каждый вызов next()
должен обновлять переменную stati c для хранения последнего результата. первая последовательность 0
s будет сгенерирована заранее и должна исправить длину.
Я пытаюсь реализовать это в Java, поэтому я бы предпочел найти ее в Java, хотя это не критически важно, так как основная проблема - это лог c.
Моя основная идея заключалась в том, чтобы сместить крайний правый 1
, но основная проблема заключается в том, как справиться со случаем, когда в крайняя правая позиция, и я не могу понять, как двигаться дальше, исходя из этих случаев.
Это моя попытка, но она может иметь некоторую aws, которую я не знаю, как отлаживать. Кроме того, я думаю, что это можно сделать лучше, чем то, что я сделал здесь:
public static int[] next() {
int i = last_res.length - 1;
while (i >= 0) {
if (last_res[i] == 1) {
last_res[i] = 0;
if (i + 1 < last_res.length) {
last_res[i + 1] = 1;
return last_res;
} else {
i--;
while (i >= 0) {
if (last_res[i] == 1) {
last_res[i + 1] = 1;
return last_res;
}
i--;
}
}
}
i--;
}
last_res[0] = 1;
return last_res;
}
Спасибо