Inverser efficacement l'ordre des mots (et non des caractères) dans un tableau de caractères
Donné un tableau de caractères qui forme une phrase, des mots, donner un algorithme efficace pour inverser l'ordre des mots (pas de caractères).
Exemple d'entrée et de sortie:
>>> reverse_words("this is a string")
'string a is this'
Il convient de O(N) en temps et O(1) espace (split()
et en poussant sur /sautant hors de la pile ne sont pas autorisés).
Le puzzle est pris de ici.
source d'informationauteur jfs
Vous devez vous connecter pour publier un commentaire.
Une solution en C/C++:
Cela devrait être O(n) en temps et O(1) dans l'espace.
Edit: à la Nettoyer un peu.
Le premier passage sur la chaîne est évidemment O(n/2) = O(n). Le second passage est O(n + longueur combinée de tous les mots /2) = O(n + n/2) = O(n), ce qui en fait un algorithme O(n).
poussant une chaîne sur une pile puis popping est que toujours O(1)?
essentiellement, c'est la même que l'utilisation de split()...
Ne prend pas en O(1) signifie en place? Cette tâche devient facile si nous pouvons simplement ajouter des chaînes et des trucs, mais qui utilise de l'espace...
MODIFIER: Thomas Watnedal est droit. La suite de l'algorithme est O(n) en temps et O(1) dans l'espace:
Je suppose que nous aurions besoin de prouver que l'étape 2 est vraiment seulement O(2n)...
Voici ma réponse. Pas d'appels de bibliothèque et pas de temp structures de données.
En pseudo code:
@Daren Thomas
Mise en œuvre de votre algorithme en O(N), O(1) dans l'espace) dans D (Digital Mars):
De sortie:
en Ruby
Dans C: (C99)
Cela donne de sortie:
Ce qui prend au plus 4N temps, avec une petite constante de l'espace.
Malheureusement, Il ne gère pas les signes de ponctuation ou de cas gracieusement.
O(N) dans l'espace et le temps O(N) en temps de la solution en Python:
Vous utiliser ce qui est connu comme un processus itératif en fonction récursive, qui est O(N) en temps qu'il faut N (N étant le nombre de mots) itérations pour compléter et O(1) dans l'espace comme chaque itération détient son propre état, dans les arguments de la fonction.
Note: j'ai écrit cela dans le schéma dont je suis un novice complet, alors, toutes mes excuses pour le manque de corriger la manipulation de la chaîne.
retirez-le premier mot trouvé le premier mot de la phrase, prend alors la section de caractères (incluant les espaces et la ponctuation) et l'enlève et retourne la nouvelle phrase
ajoutez-le premier mot trouvé le premier mot de la phrase, prend alors la section de caractères (incluant les espaces et la ponctuation) et l'ajoute à l'inverse de la phrase et retourne un nouvel inverse peine contenu.
NOTE: la Phrase doit se terminer par point(.)
parce que caractère NULL n'est pas attribué automatiquement
à la fin de la phrase*
Pousser chaque mot sur une pile. Pop tous les mots en dehors de la pile.
edit: je suppose que je devrais lire l'ensemble de la question... et de réaliser.
Efficace en termes de mon temps à: a pris moins de 2 minutes pour écrire dans REBOL:
L'essayer:
reverse_words "ceci est une chaîne"
"une chaîne est cette"
C++ solution:
Un Rubis solution.
en C#, au lieu de O(n), et testé:
Ce problème peut être résolu en O(n) en temps et O(1) dans l'espace. L'exemple de code se présente comme indiqué ci-dessous:
En une seule ligne:
De sortie:
L'algorithme pour résoudre ce problème est basée sur deux étapes, la première étape va inverser les mots individuels de la chaîne,puis dans la deuxième étape, inverser l'ensemble de la chaîne. La mise en œuvre de l'algorithme prendra O(n) en temps et O(1) l'espace de la complexité.