Vous savez que log_2(5)=2.32. De là, on constate que 2^2 < 5 et 2^3 > 5.
Regardez maintenant une matrice des réponses possibles :
j/i 0 1 2 3 4 5
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 ...
Maintenant, pour cet exemple, choisissez les numéros dans l'ordre. L'ordre serait le suivant :
j/i 0 1 2 3 4 5
0 1 2 3 5 7 10
1 4 6 8 11 14 18
2 9 12 15 19 23 27
3 16 20 24...
Notez que chaque ligne commence 2 colonnes après la ligne qui la commence. Par exemple, i=0 j=1 vient directement après i=2 j=0.
Un algorithme que nous pouvons dériver de ce modèle est donc (en supposant que j>i) :
int i = 2;
int j = 5;
int k;
int m;
int space = (int)(log((float)j)/log((float)i));
for(k = 0; k < space*10; k++)
{
for(m = 0; m < 10; m++)
{
int newi = k-space*m;
if(newi < 0)
break;
else if(newi > 10)
continue;
int result = pow((float)i,newi) * pow((float)j,m);
printf("%d^%d * %d^%d = %d\n", i, newi, j, m, result);
}
}
NOTE : Le code ici plafonne les valeurs des exposants de i et j pour qu'ils soient inférieurs à 10. Vous pourriez facilement étendre cet algorithme pour qu'il s'adapte à toute autre limite arbitraire.
NOTE : Le temps d'exécution de cet algorithme est O(n) pour les n premières réponses.
NOTE : La complexité spatiale de cet algorithme est O(1)
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.