Найдите наименьшее значение K такое, что побитовое И чисел в диапазоне [N, NK] равно 0

Опубликовано: 22 Сентября, 2022

Для заданного целого числа N задача состоит в том, чтобы найти наименьшее число K такое, что побитовое И всех чисел в диапазоне [N, NK] равно 0, т. е. N & (N - 1) & (N - 2) &... (N – К) = 0 .

Примеры:

Input: N = 17

Output: 2

Explanation:

17&16 = 16

16&15 = 0

Since, we need to find the smallest K, So we stop here.

K = N – 15 = 17 – 15 = 2

Input: N = 4

Output: 1

Explanation:

4&3 = 0

Since, we need to find the smallest k, So we stop here.

Наивный подход: самый простой подход к решению проблемы - начать с заданного числа и взять побитовое И с одним числом меньше текущего числа, пока кумулятивное побитовое И не будет равно 0 . Выполните следующие шаги, чтобы решить эту проблему:

  • Объявите переменную cummAnd , в которой хранится коммутативное побитовое И, и инициализируйте ее значением n .
  • Объявите переменную i и инициализируйте его с n - 1.
  • Запускаем цикл, пока cummAnd не равен 0:
    • cummAnd = cummAnd & i.
    • Уменьшить i на 1.
  • Наконец, выведите n – i.

Ниже представлена реализация следующего подхода:

Временная сложность : O(N)

Вспомогательное пространство : O(1)

Эффективный подход: эту проблему можно решить, используя свойства побитового оператора И, т.е. если установлены оба бита, то только результат будет ненулевым. Итак, нам нужно найти наибольшую степень числа 2 , которая меньше или равна N (скажем, X ). Выполните следующие шаги, чтобы решить эту проблему:

  • Функция log2(n) дает степень числа 2 , которая равна n .
  • Так как его тип возвращаемого значения двойной. Поэтому мы используем функцию пола, чтобы получить наибольшую степень числа 2 , которая меньше или равна n , и сохранить ее в X.
  • Х = (1 << Х) – 1.
  • Наконец, выведите N – X.

Ниже представлена реализация следующего подхода:

Временная сложность: O (log N)

Космическая сложность: O(1)