Voici une façon plus raffinée de le faire (plus raffinée que ma réponse précédente, bien sûr) :
imaginez que les chiffres sont placés dans une matrice :
0 1 2 3 4 5 -- this is i
----------------------------------------------
0| 1 2 4 8 16 32
1| 5 10 20 40 80 160
2| 25 50 100 200 400 800
3| 125 250 500 1000 2000 ...
4| 625 1250 2500 5000 ...
j on the vertical
ce que vous devez faire est de "marcher" sur cette matrice, en commençant à (0,0)
. Vous devez également garder une trace de vos prochains mouvements possibles. Lorsque vous commencez à (0,0)
vous n'avez que deux options : soit (0,1)
o (1,0)
puisque la valeur de (0,1)
est plus petit, vous le choisissez. puis faites de même pour votre choix suivant (0,2)
o (1,0)
. Jusqu'à présent, vous avez la liste suivante : 1, 2, 4
. Votre prochain mouvement est (1,0)
puisque cette valeur est inférieure à (0,3)
. Cependant, vous avez maintenant trois Vous avez le choix pour votre prochain mouvement : soit (0,3)
ou (1,1)
ou (2,0)
.
Vous n'avez pas besoin de la matrice pour obtenir la liste, mais vous devez garder une trace de tous vos choix (c'est-à-dire que lorsque vous arriverez à 125+, vous aurez 4 choix).
66 votes
L'algorithme optimal en termes de temps de programmation est de générer avec deux boucles imbriquées, puis de trier. Pourquoi posent-ils ce genre de questions ?
22 votes
Vous pouvez déterminer les points de transition en regardant quel chiffre est le plus grand.
2^2 < 5
mais2^3 > 5
donc à ce moment là vous augmentez j. Je pense que vous pouvez produire le résultat en O(n) plutôt qu'en O(nlgn). @tom-zynch deux boucles imbriquées est O(n^2). Cette question est très valable0 votes
@Mikhail, vous devez générer i j chiffres, quoi que vous fassiez. La différence se situe entre un algorithme spécialisé qui pourrait trier en O(i j) ou un tri général en O(i j log(i j)).
1 votes
Il n'y a qu'une seule sortie, donc la solution optimale est O(n). Lisez ma solution ci-dessous
3 votes
Une question similaire a déjà été abordée auparavant, apparemment : stackoverflow.com/questions/4600048/nth-ugly-number .
0 votes
@Tom Zych Quelles seraient les limites de vos boucles ? Disons que nous voulons laisser les exposants être n'importe quel nombre entier positif. Vous boucleriez à l'infini ? De plus, la seule raison pour laquelle mon algorithme a besoin de calculer toutes les paires i,j est pour la sortie.
0 votes
Mmm, je vois que j'avais mal interprété la question. Je pensais que nous devions commencer par des limites supérieures initiales
i
yj
. Alors oui, nous avons besoin d'une autre voie.1 votes
... et le PO devrait probablement déjà choisir une réponse. Après tout, il en a déjà plein de bonnes.
1 votes
Il y a un modèle, si vous regardez le problème comme une matrice i*j.
0 votes
Par curiosité, quel était le poste à pourvoir ?
1 votes
Ingénieur logiciel chez Google. C'était seulement l'écran du téléphone aussi. Ça me semble assez dur.
1 votes
Une question comme celle-ci devrait être posée à une entreprise comme Google. Toute entreprise ordinaire qui pose des questions de ce type n'a pas les moyens d'embaucher des candidats suffisamment compétents pour y répondre sous la pression et dans le temps imparti d'un entretien. Ou ne trouverait pas de candidats aussi bons en premier lieu.