Я пытаюсь решить следующую проблему из раздела "Манипуляция бит" на сайте Hacker Rank с использованием новых возможностей Java 8, таких как Stream
s.
Описание проблемы:
Учитывая целое число n, найдем каждое x такое, что:
- 0 <= x <= n
- n + x = n ^ x
где ^ обозначает побитовый оператор XOR. Затем напечатайте целое число, обозначающее общее число x, удовлетворяющее указанным выше критериям.
Ограничения
- 0 <= n <= 10 15
Пример ввода: 5
Результат выборки: 2
Объяснение:
При n = 5 значения x и 0 удовлетворяют условиям:
- 5 + 0 = 5 ^ 0 = 5
- 5 + 2 = 5 ^ 2 = 7
Таким образом, мы печатаем 2 как наш ответ.
Пример ввода: 10
Результат выборки: 4
Объяснение:При n = 10 значения x, 0, 1, 4 и 5 удовлетворяют условиям:
- 10 + 0 = 10 ^ 0 = 10
- 10 + 1 = 10 ^ 1 = 11
- 10 + 4 = 10 ^ 4 = 14
- 10 + 5 = 10 ^ 5 = 15
Таким образом, мы печатаем 4 как наш ответ.
Мой код выглядит следующим образом:
public class SumVsXor
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
long n = in.nextLong();
long count = LongStream.rangeClosed(0, n)
.filter(k -> k + n == (k ^ n))
.count();
System.out.println(count);
}
}
Проблема заключается в том, что этот код не передает все тестовые примеры.
Он работает при малых значениях n
, но для больших значений, таких как 1000000000000000
, он не выполняется из-за таймаута.
Интересно, не может ли LongStream
обрабатывать Stream
с помощью этого множества элементов.