Contexte:
J'ai initialement posté cette question hier soir, et j'ai reçu un contrecoup sur son imprécision. J'ai depuis consulté de nombreux personnels concernant non seulement la formulation du problème, mais aussi sa complexité (qui n'est pas O (1)). Ce problème de programmation est un mauvais tour sur une question d'entrevue d'Amazon.
Question:
Étant donné une chaîne d'entiers concaténés au hasard [0, 250), 0 à 250 exclusif, il manque UN numéro dans la séquence. Votre travail consiste à écrire un programme qui calculera ce nombre manquant. Il n'y a aucun autre nombre manquant dans la séquence en dehors de celui-ci, et c'est ce qui rend ce problème si difficile, et peut-être difficile à calculer.
Faire ce problème à la main sur des chaînes plus petites, comme les exemples 1 et 2 ci-dessous, est évidemment très facile. Inversement, le calcul d'un nombre manquant sur des ensembles de données incroyablement volumineux impliquant des nombres à trois ou quatre chiffres serait incroyablement difficile. L'idée derrière ce problème est de construire un programme qui fera ce processus pour vous.
Une information important:
Une chose qui m'a semblé assez confuse lorsque j'ai posté ce problème hier soir était: ce qu'est exactement un nombre manquant. Un nombre manquant est le numéro INTÉRIEUR de la plage spécifiée ci-dessus; PAS nécessairement le chiffre. Dans l'exemple 3, vous verrez que le nombre manquant est 9, même s'il apparaît dans la séquence. Il y a 3 endroits où le DIGIT 9 apparaîtra dans une série de [0, 30): «9», «19» et «29». Votre objectif est de différencier ces derniers et de découvrir que 9 est le NUMÉRO manquant (à l'intérieur de l'exemple 3). En d'autres termes, la partie délicate consiste à trouver quelles séquences de chiffres sont complètes et qui appartiennent à d'autres nombres.
Contribution:
L'entrée est une chaîne S, contenant des entiers de 0 à 249 inclus, ou de 0 à 250 exclusif (en d'autres termes, [0, 250)). Ces nombres entiers, comme indiqué ci-dessus, sont brouillés pour créer une séquence aléatoire. Il n'y a PAS de délimiteurs («42, 31, 23, 44») ou de remplissage 0 (003076244029002); les problèmes sont exactement tels que décrits dans les exemples. Il est garanti qu'il n'y a qu'une seule solution aux problèmes réels. Les solutions multiples ne sont pas autorisées pour celles-ci.
Critères gagnants:
Celui qui aura la mémoire la plus rapide et la plus faible sera le gagnant. Dans le cas miraculeux d'un temps lié, une mémoire inférieure sera utilisée pour le brise-temps. Veuillez énumérer Big O si vous le pouvez!
Exemples:
Les exemples 1 et 2 ont une plage de [0, 10)
Les exemples 3 et 4 ont une plage de [0, 30)
(Les exemples 1 à 4 sont juste pour la démonstration. Votre programme n'a pas besoin de les gérer.)
Les exemples 5 ont une plage de [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
, pas seulement250
? / Et le232
problème? Toutes les possibilités ou une? Je me rends compte que vous étiez au courant de ce problème, mais je ne trouve pas clair dans la question. / S'il s'agit du code le plus rapide, il doit y avoir un moyen de les mesurer. Bien sûr, l'exécution sur un supercalculateur est différente de l'exécution sur un ancien ordinateur. / Parce que personne n'a dit ça, - Bienvenue chez PPCG!N
à, disons, 1000 ou 10000.Réponses:
Clingo , ≈ 0,03 seconde
C'est trop rapide pour être mesuré avec précision - vous devrez autoriser des cas d'entrée plus grands plutôt que de vous arrêter artificiellement à 250.
Exemple d'entrée
L'entrée est une liste de paires ( k , k ème chiffres). Voici le problème 1:
Exemple de sortie
la source
45879362100
avecn = 11
et1
manquant (réponsesmissing(0)
).missing(10)
est également valide)?C ++, 5000 cas de test aléatoires en 6,1 secondes
C'est pratiquement rapide, mais il peut exister des tests qui le ralentissent. Complexité inconnue.
S'il existe plusieurs solutions, il les imprimera toutes. Exemple .
Explication:
Comptez les occurrences de chiffres.
Énumérez toutes les réponses possibles.
Vérifiez si un candidat est une réponse valide:
3-1. Essayez de diviser la ou les chaînes par des nombres qui n'apparaissent qu'une seule fois et marquez-les comme identifiés, à l'exception du candidat.
Par exemple,
2112282526022911192312416102017731561427221884513
n'en a qu'un14
, il peut donc être divisé en211228252602291119231241610201773156
et27221884513
.3-2. Si une chaîne fractionnée a une longueur 1, marquez-la comme identifiée.
En cas de contradiction (identifiée plusieurs fois), le candidat n'est pas valide.
Si nous ne pouvons pas trouver le candidat dans la chaîne, le candidat est valide.
3-3. Si un fractionnement est effectué, répétez l'étape 3-1. Sinon, effectuez une recherche par force brute pour vérifier si le candidat est valide.
Essayez-le en ligne!
la source
Propre , ~ 0,3 s
Correction d'un énorme bug dans l'algorithme, besoin de le ré-optimiser maintenant.
Compiler avec
clm -h 1024M -s 16M -nci -dynamics -fusion -t -b -IL Dynamics -IL Platform main
Cela fonctionne en prenant chaque nombre que la chaîne doit contenir et en comptant le nombre de places où la séquence de chiffres requise est présente dans la chaîne. Il effectue ensuite à plusieurs reprises ces étapes:
singles
)singles
)la source