Faire pivoter une chaîne de caractères en c++?
Je suis à la recherche d'un moyen pour faire pivoter une chaîne de caractères en c++. Je passe tout mon temps en python, donc mon c++ est très rouillé.
Voici ce que je veux faire: si j'ai une chaîne de caractères 'abcde' je le veux changé pour "bcdea' (premier caractère déplacé à la fin).
Voici comment je l'ai fait en python:
def rotate(s):
return s[1:] + s[:1]
Je ne suis pas sûr de savoir comment faire en rpc. Peut-être utiliser un tableau de caractères?
Vous devez vous connecter pour publier un commentaire.
Je recommande
std::rotate
:std::rotate
peut être nettement plus rapide que sur un rouleau de votre propre mise en œuvre. donc, si vous voulez vous assurer à la fois la justesse et de la performance, alors il est également bon d'utiliserstd::rotate
. voir stackoverflow.com/questions/21160875/why-is-stdrotate-so-fastVoici une solution qui "flotte" le premier caractère de la fin de la chaîne, un peu comme une seule itération de tri à bulles.
si vous souhaitez que la fonction de rotation de la chaîne en place:
Voici un moyen relativement simple:
Noter que ceci va modifier le tampon en place.
Il y a une norme faites tourner fonction trouvée dans l'algorithme d'en-tête.
Si vous voulez le faire vous-même, vous pouvez essayer ce qui suit:
Mais bien sûr, à l'aide de la bibliothèque standard est préférable ici, et dans la plupart des cas.
EDIT #1 j'ai juste vu litb de réponse. Battre à nouveau!
EDIT #2 je veux juste mentionner que le rotate_string fonction échoue sur les chaînes de longueur 0. Vous recevrez un std::out_of_range erreur. Vous pouvez remédier à cela avec un simple bloc try/catch, ou d'utiliser std::rotation 🙂
EDIT #3 Retour sur la même chaîne si la longueur de la chaîne est de 0.
Est de le faire en place une exigence?
Si non, vous êtes probablement mieux de prendre une sous-chaîne de tous, mais le premier char, et en ajoutant que le premier char à la fin.
Si vous ne voulez pas de ces en place des solutions, puis votre code python peuvent être directement convertis en C++, avec un peu de code supplémentaire pour composer avec le fait que l'indice hors limites est de mauvaises nouvelles en C++.
Donc,
Ce n'est pas le plus efficace: il sera presque certainement faire plus de la chaîne de création que le minimum possible. Mais vous n'avez généralement pas besoin de le plus efficace, et vous avez
reserve
etappend
si vous voulez faire la concaténation inutile sans affectation.À un certain point, j'ai été obsédé par diviser et conquérir, et utilisé les méthodes suivantes
car il "Divise" le problème pour les petits problèmes, ma conjecture est que cela fonctionne mieux.
Commentaires des experts sur la complexité et l'accès à la mémoire de comportement sont les bienvenues :).
Voici le code en C qui n'utilise pas de fonctions externes:
Elle tourne de la chaîne en place à la fois en avant et en arrière par une valeur de n'importe quelle taille.
Pour faire tourner la chaîne à la fois en avant et en arrière serait un peu fastidieux de sorte qu'il est mieux de ne faire avant de tourner et de calculer la valeur correcte pour l'arrière.Aussi, si la valeur de rotation est plus que la longueur de la chaîne, puis il nous suffit de le couper, car le résultat serait le même de toute façon.
valeur = longueur - ((0 - valeur) % de la longueur) : signifie que si la valeur de rotation est négatif, puis définissez la valeur de la longueur de la chaîne, moins le résultat positif de la le reste de la division de la valeur par la longueur de la chaîne. Par exemple: la rotation d'une chaîne de caractères de longueur par 10 -9 postes serait la même que la rotation de +1. La rotation de la même chaîne par -19 positions également être la même que la rotation par plus un.
valeur = valeur % de la longueur : signifie que si la valeur positive est plus que la longueur de la corde, puis diviser par la longueur de la chaîne et de prendre le reste. Le résultat serait le même que si nous avons fait le chemin le plus long.
À faire la rotation en place, nous allons avoir besoin de sauter par la valeur de la rotation d'échanger des personnages qui sont loin d'intervalle. Nous commençons à la position zéro, aller de l'avant par la rotation de la valeur et de continuer à sauter de ce montant. si nous allons passé la fin de la chaîne, nous enroulez simplement le début. Le problème est que si la valeur est un nombre pair, nous serons là où nous avons commencé et il va rater tous les caractères illisibles. La variable index0 est là pour indiquer où nous avons commencé à partir. Si nous retrouver à cet indice, alors nous avons besoin de passer par une position d'index et de continuer à sauter. Nous continuons à le faire jusqu'à ce que tous les personnages sont inversés
À ce stade, nous avons besoin de deux variables temporaires pour faire l'échange en place. J est la position de départ. Nous déplacer le personnage à l'indice J de la première variable temporaire. Maintenant, nous I de la boucle de la longueur de la chaîne. K est l'index de destination, J plus la valeur de rotation Enroulé autour de la fin si nécessaire. Déplacer le personnage à l'indice K de la deuxième variable temporaire. Mettre le personnage à partir de l'index J en indice K à l'aide de la première variable temporaire. Par la voie de la raison pour laquelle nous ne déplace pas seulement le caractère directement à partir de l'indice J dans l'indice K est à cause de la dernière partie de la boucle, les indices peuvent changer entre les deux boucles, mais les personnages dans temp1 ne devrait pas.
Maintenant que l'on échange les temp1 avec temp2.
Cette dernière partie est pour le cas où la valeur est un nombre pair et nous sommes de retour là où nous avons commencé. Cela arrive par fois la valeur de rotation moins un. incrément d'indice J par un et réinitialiser les valeurs de départ. Boucle jusqu'à ce que fait.
Une vidéo de démonstration peut être trouvé ici: https://www.youtube.com/watch?v=TMzaO2WzR24