0
votes

Comment créer des entiers avec des chiffres croissants de plus efficacement?

Le code ci-dessus fournit la liste des entiers dont les chiffres sont en ordre croissant. Mais avec un nombre croissant de chiffres, cela devient moins efficace. Y a-t-il une façon de rendre le code plus efficace? Pouvons-nous le faire fonctionner pour des chiffres plus de 30? XXX


5 commentaires

Pourriez-vous ajouter un exemple d'entrée et de sortie souhaité?


Vous devez choisir un meilleur algorithme. Cette méthode de la force brute sera lente, peu importe la manière dont vous accélérez la pièce.


@MarkRansom, je sais que c'est inefficace. Mais je ne pouvais penser à aucun autre algorithme mieux que cela.


Ne traversez pas tous les chiffres et vérifiez s'ils répondent à l'exigence. Générer uniquement des nombres répondant à l'exigence en premier lieu.


Voulez-vous vraiment tous ces chiffres? Ou voulez-vous juste savoir combien il y a?


3 Réponses :


2
votes

suggestion d'un algorithme:

  • Obtenez le numéro de départ, par exemple 2004050
  • à partir du début, définissez tous les chiffres inférieurs au premier chiffre à la valeur du premier chiffre, c'est-à-dire 2 22 4 2 5 2
  • Répétez le deuxième chiffre (encore 2224252), troisième chiffre (encore 2224252), quatrième chiffre (2224 <2224 4 5 4 ) jusqu'au dernier chiffre (222445 < fort> 5 ).

    De cette façon, vous obtenez le prochain numéro croissant. Faites-en une méthode. Vous remarquerez que vous pouvez même modifier cela un peu.

    Après cela, ajoutez 1 au nombre et répétez le processus sur chacun. Vous obtiendrez le 2224456, 2224457, 2224458, 2224459.

    Lorsque vous atteignez 2224460, il sera transformé en nombre croissant 222446 6 .

    Je ne suis pas sûr que cela fonctionnera pour des chiffres dans la gamme 10 ^ 30, mais cela ignorera au moins 11% des chiffres au début (1000 ... à 1111 ...). Cela devrait se reproduire à nouveau à 1200 ... à 1222 ... et ainsi de suite, alors il pourrait être assez rapide.


0 commentaires

3
votes

Procédé avec récursion: xxx

impression: xxx


référence rapide à l'aide TIMIIT : xxx

impression sur ma machine: xxx


4 commentaires

IMHO, OP aurait pu mettre en œuvre cela lui-même. Mais il est également bon de savoir que vous fournissez des services de codage gratuits.


@Thomasweller J'ai essayé de le rendre plus efficace, mais il faut environ 19 secondes pour générer (20) . Pour 30 je ne l'ai pas essayé.


J'écrirais cette première ligne comme str_numbers = '0123456789' . Beaucoup plus simple.


@Andrejkesely, le code fonctionne correctement. J'ai appris quelque chose de nouveau aujourd'hui. :)



3
votes

Une solution consiste à utiliser itTools.combinations_with_replacement : xxx

Notez que selon le DOC ,

Si l'entrée iTable est triée, les tuples combinés seront produit dans l'ordre trié

L'ordre des sorties est donc garanti.

Entre-temps, l'implémentation équivalente dans le document suggère que dans chaque combinaison de sortie tuple, les éléments suivent le même ordre que l'entrée introductive. Par conséquent, l'ordre des chiffres dans chaque combinaison de sortie est également garanti.


0 commentaires