Вопрос мне задали на собеседовании. Я был близок к решению, но, к сожалению, не решил его.
Предположим, у нас есть последовательность, содержащая N чисел типа long
. И мы точно знаем, что среди этой последовательности каждое число встречается ровно n раз, за исключением одного числа, которое встречается ровно m раз ( 0 < m < n ). Как найти это число с помощью O (N) операций и O (1) дополнительной памяти?
В простейшем случае (когда n = 2 и m = 1 ) все, что нам нужно сделать, это просто выполнить накопительное xor
для каждого числа в последовательности. Результат будет равен желаемому числу. Но я застрял, пытаясь разобраться с произвольными m и n .
Я был бы признателен за фактическое решение C ++.
РЕДАКТИРОВАТЬ: Мы знаем фактические значения ] m и n априори.
Пример. Мы знаем, что n = 3 и m = 2. Последовательность ( N = 8 ) есть
5 11 5 2 11 5 2 11
И правильный ответ равно 2 в данном конкретном случае, потому что это встречается только дважды.