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