Задний план:
Я первоначально отправил этот вопрос прошлой ночью, и получил отрицательную реакцию на его неопределенность. С тех пор я проконсультировался со многими сотрудниками по поводу не только формулировки проблемы, но и ее сложности (что не является O (1)). Эта проблема программирования является злым бременем в вопросе об интервью на Amazon.
Вопрос:
Для заданной строки случайным образом сцепленных целых чисел [0, 250), исключая от 0 до 250, в последовательности отсутствует ОДИН номер. Ваша задача - написать программу, которая вычислит это недостающее число. В последовательности нет других пропущенных чисел, кроме той, что делает эту проблему такой сложной и, возможно, сложной в вычислительном отношении.
Выполнить эту задачу вручную на меньших строках, таких как примеры 1 и 2 ниже, очевидно, очень легко. И наоборот, вычисление пропущенного числа в невероятно больших наборах данных, включающих трехзначные или четырехзначные числа, было бы невероятно трудным. Идея этой проблемы состоит в том, чтобы создать программу, которая будет выполнять этот процесс для вас.
Важная информация:
Одна вещь, которая показалась мне довольно запутанной, когда я опубликовал эту проблему прошлой ночью, заключалась в том, что именно означает отсутствующее число. Отсутствующее число - это число ВНУТРИ диапазона, указанного выше; НЕ обязательно цифра. В примере 3 вы увидите, что пропущенное число равно 9, даже если оно указано в последовательности. DIGIT 9 будет отображаться в трех местах серии [0, 30): «9», «19» и «29». Ваша цель - провести различие между ними и обнаружить, что 9 - это пропущенное число (внутри примера 3). Другими словами, сложная часть заключается в том, чтобы выяснить, какие последовательности цифр полны, а какие принадлежат другим числам.
Входные данные:
В качестве входных данных используется строка S, содержащая целые числа от 0 до 249 включительно или от 0 до 250 (другими словами, [0, 250)). Эти целые числа, как указано выше, скремблируются для создания случайной последовательности. Есть НЕТ разделителей («42, 31, 23, 44») или дополнения 0 (003076244029002); проблемы в точности как описано в примерах. Гарантируется, что в актуальных задачах есть только 1 решение. Несколько решений не разрешены для них.
Критерии победы:
Тот, кто имеет самый быстрый и самый низкий объем использования памяти, будет победителем. В чудесном случае, когда время связано, для прерывателя времени будет использоваться более низкая память. Пожалуйста, перечислите Big O, если можете!
Примеры:
Примеры 1 и 2 имеют диапазон [0, 10)
Примеры 3 и 4 имеют диапазон [0, 30)
(Примеры 1-4 приведены только для демонстрации. Ваша программа не должна их обрабатывать.)
Примеры 5 имеют диапазон [0, 250)
1. 420137659
- Missing number => 8
2. 843216075
- Missing number => 9
3. 2112282526022911192312416102017731561427221884513
- Missing number => 9
4. 229272120623131992528240518810426223161211471711
- Missing number => 15
5. 11395591741893085201244471432361149120556162127165124233106210135320813701207315110246262072142253419410247129611737243218190203156364518617019864222241772384813041175126193134141008211877147192451101968789181153241861671712710899168232150138131195104411520078178584419739178522066640145139388863199146248518022492149187962968112157173132551631441367921221229161208324623423922615218321511111211121975723721911614865611197515810239015418422813742128176166949324015823124214033541416719143625021276351260183210916421672722015510117218224913320919223553222021036912321791591225112512304920418584216981883128105227213107223142169741601798025
- Missing number => 71
Test Data:
Problem 1: 6966410819610521530291368349682309217598570592011872022482018312220241246911298913317419721920718217313718080857232177134232481551020010112519172652031631113791105122116319458153244261582135510090235116139611641267691141679612215222660112127421321901862041827745106522437208362062271684640438174315738135641171699510421015199128239881442242382361212317163149232839233823418915447142162771412092492141987521710917122354156131466216515061812273140130240170972181176179166531781851152178225242192445147229991613515911122223419187862169312013124150672371432051192510724356172282471951381601241518410318414211212870941111833193145123245188102
Problem 2: 14883423514241100511108716621733193121019716422221117630156992324819917158961372915140456921857371883175910701891021877194529067191198226669314940125152431532281961078111412624224113912011621641182322612016512820395482371382385363922471472312072131791925510478122073722091352412491272395020016194195116236186596116374117841971602259812110612913254255615723013185162206245183244806417777130181492211412431591541398312414414582421741482461036761192272120204114346205712198918190242184229286518011471231585109384415021021415522313136146178233133168222201785172212108182276835832151134861116216716910511560240392170208215112173234136317520219
Problem 3: 1342319526198176611201701741948297621621214122224383105148103846820718319098731271611601912137231471099223812820157162671720663139410066179891663131117186249133125172622813593129302325881203242806043154161082051916986441859042111711241041590221248711516546521992257224020174102234138991752117924457143653945184113781031116471120421331506424717816813220023315511422019520918114070163152106248236222396919620277541101222101232171732231122301511263822375920856142187182152451585137352921848164219492411071228936130762461191564196185114910118922611881888513917712153146227193235347537229322521516718014542248813617191531972142714505519240144
Problem 4: 2492402092341949619347401841041875198202182031161577311941257285491521667219229672211881621592451432318618560812361201172382071222352271769922013259915817462189101108056130187233141312197127179205981692121101632221732337196969131822110021512524417548627103506114978204123128181211814236346515430399015513513311152157420112189119277138882021676618323919018013646200114160165350631262167910238144334214230146151171192261653158161213431911401452461159313720613195248191505228186244583455139542924222112226148941682087115610915344641782142472102436810828123731134321131241772242411722251997612923295223701069721187182171471055710784170217851
N
, а не только250
? / Как насчет232
вопроса? Все возможности или один любой? Я понимаю, что вы знали об этой проблеме, но я нахожу это неясным в этом вопросе. / Если это самый быстрый код, должен быть способ их измерить. Конечно, работа на суперкомпьютере отличается от работы на старом компьютере. / Потому что никто не сказал этого, - Добро пожаловать в PPCG!N
, скажем, 1000 или 10000.Ответы:
Клинго , ≈ 0.03 секунды
Это слишком быстро, чтобы его можно было точно измерить - вам нужно разрешить большие входные данные, а не искусственно останавливаться на 250.
Пример ввода
Ввод представляет собой список ( k , k- й цифры) пар. Вот проблема 1:
Пример вывода
источник
45879362100
сn = 11
и1
без вести (ответовmissing(0)
).missing(10)
также верно)?C ++, 5000 случайных тестов за 6,1 секунды
Это практически быстро, но могут существовать некоторые тестовые сценарии, которые делают его медленным. Сложность неизвестна.
Если есть несколько решений, он напечатает их все. Пример .
Объяснение:
Посчитайте вхождения цифр.
Перечислите все возможные ответы.
Проверьте, является ли кандидат верным ответом:
3-1. Попробуйте разбить строку (ы) по номерам, которые встречаются только один раз, и пометить ее как идентифицированную, за исключением кандидата.
Например,
2112282526022911192312416102017731561427221884513
имеет только один14
, поэтому его можно разбить на211228252602291119231241610201773156
и27221884513
.3-2. Если какая-либо разделенная строка имеет длину 1, пометьте ее как идентифицированную.
Если возникло какое-либо противоречие (выявлено более одного раза), кандидат недействителен.
Если мы не можем найти кандидата в строке, он действителен.
3-3. Если есть какое-либо разделение, повторите шаг 3-1. В противном случае, выполните поиск методом грубой силы, чтобы проверить, является ли кандидат действительным.
Попробуйте онлайн!
источник
Чистый , ~ 0.3с
Исправлена огромная ошибка в алгоритме, теперь нужно заново оптимизировать его.
Компилировать с
clm -h 1024M -s 16M -nci -dynamics -fusion -t -b -IL Dynamics -IL Platform main
Это работает путем взятия каждого числа, которое должна содержать строка, и подсчета количества мест, где требуемая последовательность цифр присутствует в строке. Затем он многократно выполняет эти шаги:
singles
)singles
)источник