Сложность: medium
Даны 2 целых числа n и start. Ваша задача - вернуть любую перестановку p из (0,1,2.....,2^n -1) такую, что : p[0] = start p[i] и p[i+1] отличаются только одним битом в их двоичном представлении. p[0] и p[2^n -1] также должны отличаться только одним битом в их двоичном представлении.
Пример:
Input: n = 2, start = 3
Output: [3,2,0,1]
👨💻 Алгоритм:
1⃣Генерация Грей-кода:
Генерация Грей-кода для чисел от 0 до 2𝑛−1
2⃣Определение начальной позиции:
Находим индекс числа start в последовательности Грей-кода.
3⃣Построение перестановки:
Формируем перестановку, начиная с числа start и следуя по циклическому Грей-коду.
😎 Решение:
function circularPermutation($n, $start) {
$grayCode = function($n) {
$result = [];
for ($i = 0; $i < (1 << $n); $i++) {
$result[] = $i ^ ($i >> 1);
}
return $result;
};
$gray = $grayCode($n);
$startIndex = array_search($start, $gray);
return array_merge(array_slice($gray, $startIndex), array_slice($gray, 0, $startIndex));
}Ставь 👍 и забирай 📚 Базу знаний