0
votes

Trouver le prochain numéro le plus petit avec les mêmes chiffres

Je travaille avec Ruby et je tente d'écrire un code qui prendra une entrée numérique et de renvoyer le prochain numéro le plus grand avec les mêmes chiffres.

J'ai vu cette même question posée ici avant, mais le code diffère trop pour m'aider à résoudre mon problème particulier. P>

def next_smaller n
  ndigitsarray=n.digits.reverse
  bigdigitsarray=ndigitsarray.sort.reverse
  bigdigitsjoint=bigdigitsarray.join.to_i
    while bigdigitsjoint>n do 
  bigdigitsarray.insert(1, bigdigitsarray.delete_at(0)) 
    end
  return bigdigitsarray.join.to_i
end


1 commentaires

Votre solution est fausse car elle ne couvre que le déplacement linéaire de chiffres et non la permutation (par exemple, lorsque deux ou plusieurs chiffres échangent des places, non seulement remplacent. Il ne trouvera pas le plus petit nombre le plus proche avec les mêmes chiffres, il ne trouvera rien parce que Votre variable jointe ne change pas après la première affectation et que vous le vérifiez dans la condition de While. On dirait que vous ne comprenez pas la programmation que bien, vous devriez donc mieux l'apprendre mieux (comme un concept d'affectation variable) avant de s'attaquer à de tels problèmes. .


3 Réponses :


0
votes

Si vous n'êtes pas chargé de créer vous-même la gamme de chiffres, il y a un Array # Permutation Méthode disponible pour générer toutes les combinaisons de numéros basées sur votre numéro d'origine.

Ensuite, après un certain nettoyage et de tri, vous pouvez trouver l'index de votre numéro, puis ajouter 1 pour rechercher le numéro le plus élevé suivant. P>

def next_number(i)
  puts "Your number is #{i}"
  permutations = i.to_s.split('').permutation.to_a.map(&:join).map(&:to_i).uniq.sort
  index = (permutations.find_index(i) + 1)

  puts "Next highest is #{permutations[index]}"
end

# Usage
next_number(4357)
next_number(81541)
  • ne s'adresse pas si votre numéro est la plus haute permutation (E.g. Next_Number (999) CODE>) LI>
  • probablement pas le moyen "le plus rapide" de le faire, si cela fait partie d'un défi de code LI> ul> p>


0 commentaires

0
votes

Vous utilisez une boucle tandis que la variable utilisée pendant que la condition ne change pas à l'intérieur de la boucle.

Une option pour résoudre le problème de la force brute utilise Array # permutation sur le Integer # chiffres tableau: p>

n.digits.permutation.uniq.map { |e| e.join.to_i }.sort.partition { |k| k > n }
#=> [[1312, 1321, 2113, 2131, 2311, 3112, 3121, 3211], [1123, 1132, 1213, 1231]]


0 commentaires

0
votes

Commençons par créer une méthode dont l'argument chiffres est un tableau de chiffres et qui renvoie un hachage ("comptage") dont les touches sont les chiffres 0-9 et dont les valeurs sont chiffres.count (d) pour chaque clé d . xxx

par exemple, xxx

(voir Array # Produit et Integer # chiffres ). Nous pouvons maintenant écrire une méthode qui renvoie le résultat souhaité. xxx

xxx Cela peut être un peu académique, nous pouvons faire mieux. Donné chiffres et chiffre_counts ci-dessus, pour mettre à jour chiffres pour xxx

Nous pouvons écrire ( Parce que le dernier chiffre est supérieur à zéro): xxx

De même, après avoir effectué une copie profonde de digit_counts : xxx

Nous pouvons mettre à jour ce hachage en écrivant: xxx

plutôt que d'appeler comte_digits . (Voir HASH # Transform_values ​​). Maintenant, révisons la méthode comme suit. xxx

xxx

D'autres améliorations seront possibles Dans le cas où le dernier chiffre est zéro (pour éviter d'appeler comte_digits ). Si, par exemple, xxx

chiffres et h pourrait être mis à jour pour n = 2129 comme suit: xxx

On pourrait faire quelque chose de similaire si n = 2100 ou 2000 , mais cela devient rapidement plus rapide Pour appeler comte_digits ,


0 commentaires