K-е наименьшее натуральное число, имеющее сумму с заданным числом, равную побитовому ИЛИ с заданным числом

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

Даны два положительных целых числа X и K , задача состоит в том, чтобы найти K -е наименьшее натуральное число Y такое, что X + Y = X | Y , где | обозначает побитовую операцию ИЛИ.

Пример:

Input: X = 5, K = 1
Output: 2
Explanation: The first number is 2 as (2 + 5 = 2 | 5 )

Input: X = 5, K = 5
Output: 18
Explanation: The list of correct values is 2, 8, 10, 16, 18. The 5th number is this list is 18

Подход: данная проблема может быть решена следуя приведенным ниже шагам:

  • Пусть конечное значение будет Y . Из свойств побитовых операций известно, что X + Y = X & Y + X | Y , где & - это побитовое И двух чисел
  • Чтобы уравнение в постановке задачи было верным, значение X и Y должно быть равно 0.
  • Таким образом, для всех позиций, если i-й бит в X включен, то он должен быть выключен для всех возможных решений Y.
  • Например, если X = 1001101001 в двоичном формате (617 в десятичном представлении), то последние десять цифр y должны быть Y = 0**00*0**0, где '*' обозначает либо ноль, либо единицу. Кроме того, мы можем добавить любое количество любых цифр в начало числа, поскольку все старшие биты равны нулям.
  • Таким образом, окончательное решение будет состоять в том, чтобы рассматривать все позиции, где бит может быть равен 0 или 1, как последовательность слева направо и находить двоичную запись K .
  • Заполните все позиции в соответствии с двоичной записью K

Ниже приведена реализация вышеуказанного подхода:

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