edik_m: (Rikki)
[personal profile] edik_m
Случайно наткнулся. Очень подходят для интервью
Задача 1. В последовательности записаны целые числа от 1 до N в произвольном порядке, но одно из чисел пропущено (остальные встречаются ровно по одному разу). N заранее неизвестно. Определить пропущенное число

Решение очевидно: просматриваем числа, находим их количество K и сумму S. По условию, N=K+1, значит, сумма чисел от 1 до N будет равна (K+1)*(K+2)/2, и пропущенное число равно (K+1)*(K+2)/2-S. Если вы почему-то боитесь переполнений, то работайте с беззнаковыми числами (там переполнения не страшны — но будьте осторожны при вычислении (K+1)*(K+2)/2 :) ), или вместо суммы ищите XOR всех чисел.

Задача 2. В последовательности записаны целые числа. Одно из чисел встречается ровно один раз, остальные — по два раза. Найти число, которое встречается один раз.

Здесь тоже всё просто: найдем XOR всех чисел — он и будет ответом. В самом деле, если какой-то бит в искомом числе равен нулю, то во всей последовательности он будет равен 1 в чётном числе элементов, и его значение в XOR равно нулю. В противном случае, аналогично, его значение в XOR равно 1. Или, проще говоря, одинаковые элементы при суммировании взаимоуничтожатся.

Задачка посложнее
Задача 3. В последовательности записаны целые числа. Число X встречается один или два раза, остальные числа — по три раза. Найти число X. Для простоты считаем, что числа неотрицательные.

Поступим аналогично предыдущей задаче: переведём каждое из чисел в троичную систему: b=b[0]+3*b[1]+32*b[2]+… Для каждого разряда найдём сумму его значений по модулю 3 (обозначим суммы s[0],s[1],s[2],...). Кроме того, посчитаем сами числа.
Если чисел в последовательности было 3*k+1, то X встретился один раз, и его значение равно s[0]+3*s[1]+32*s[2]+… Если же чисел было 3*k+2, то в наборе s[i] единицы придётся заменить на двойки и наоборот: x[i]=(3-s[i])%3, и X=x[0]+3*x[1]+32*x[2]+…


Над остальными пока сам думаю, потому и не пишу. Ссылку тоже не даю :)


Date: 2014-11-27 07:48 am (UTC)
From: [identity profile] donkihot.livejournal.com
В последней задаче должно быть 3^2 или просто 9 ;)

Date: 2014-11-27 07:52 am (UTC)
From: [identity profile] edik-m.livejournal.com
почему это?
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 9 9 9 10 10 10 10 11 11 11 12 12 12 13 13 13
8 записано один раз

Date: 2014-11-27 08:17 am (UTC)
From: [identity profile] donkihot.livejournal.com
Потому, что число системе счисления с основанием p записывается как:
X=x[0]+p*x[1]+p^2*x[2]+p^3*x[3]+ ...+ p^i*x[i]+
Т.е. в троичной:
X=x[0]+3*x[1]+3^2*x[2]+…

Date: 2014-11-27 08:20 am (UTC)
From: [identity profile] edik-m.livejournal.com
согласен. Но почему 9? у меня 8 :)

Date: 2014-11-27 09:42 am (UTC)
From: [identity profile] donkihot.livejournal.com
3^2=9 я имелл ввиду только это.
Там, где у тебя написано 32 (в трех местах) должно быть написано или 9 или 3^2

Date: 2014-11-27 09:50 am (UTC)
From: [identity profile] edik-m.livejournal.com
aa-a-a!
спасибо!

Date: 2014-11-27 01:02 pm (UTC)
From: [identity profile] efimpp.livejournal.com
на третью потратил время пока брился и чистил зубы - стыдно, получается что во второй я помнил ответ но не путь которым я когда-то к нему пришел ;-(

Date: 2014-11-27 01:24 pm (UTC)
From: [identity profile] edik-m.livejournal.com
Я давно не делал никому интервью , подзабыл, что спрашивать. А это очень неплохие задачки на сообразительность

Date: 2014-11-27 02:24 pm (UTC)
From: [identity profile] efimpp.livejournal.com
и я их когда-то задавал на интервью :-)

December 2025

S M T W T F S
 1 23456
78910111213
14151617181920
21222324252627
2829 3031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 1st, 2026 03:42 pm
Powered by Dreamwidth Studios