Fonction C++ pour compter tous les mots dans une chaîne de caractères
M'a demandé ce, lors d'une interview et apparemment, c'est une question facile, mais il n'était pas et n'est toujours pas évident pour moi.
Donné une chaîne de caractères, nombre de tous les mots. N'a pas d'importance si elles sont répétées. Juste le nombre total comme dans un des fichiers de texte nombre de mots. Les mots sont loin d'être séparés par un espace et ponctuation n'a pas d'importance, tant que c'est une partie d'un mot.
Par exemple:
A very, very, very, very, very big dog ate my homework!!!! ==> 11 words
Mon "algorithme" juste passe par la recherche d'espaces et en incrémentant un compteur jusqu'à ce que je frappe un null. Depuis je n'ai pas eu le job, et a demandé de quitter les lieux après que je suppose que Ma solution n'était pas bonne? Quelqu'un a un de plus intelligent solution? Ai-je raté quelque chose?
Bien repéré. Je n'ai pas joindre les points.
Par les réponses données ci-dessous, il semble que plus le contexte est vraiment nécessaire. Certaines industries ont recours à la "modernité" de C++, de trouver que le coût de l'utilisation de la STL et boost fait plus de place pour les gains de productivité. D'autres industries préfèrent utiliser une C-comme la version de C++, de sorte qu'il y a une correspondance directe de lignes de code d'instructions du processeur. L'avenir des réponses à des questions le long de ces lignes serait bien servi à déterminer au moins de l'industrie, le candidat postule.
Vous avez contexte autant que je fais. L'intervieweur n'a pas été très coopérative et de ne pas avoir beaucoup de commentaires quand j'ai demandé si il était à la recherche de quelque chose d'intelligent ou tout simplement à la force brute. Tandis que Martin a donné un mauvais âne réponse ci-dessous et fantastique description, j'ai vraiment eu le sentiment de l'interviewer que c'était juste un test pour voir si je pouvais coder quelque chose de "de base". Mais encore une fois je n'ai pas profiter de l'offre, de sorte que sais-je...
OriginalL'auteur eviljack | 2010-09-08
Vous devez vous connecter pour publier un commentaire.
Moins intelligent, le plus évident-pour-tous-de-la-programmeurs-sur-votre-équipe de méthode de le faire.
Mon mauvais. Je ne vois pas pourquoi tout de suite pourquoi cela fonctionne, mais les tests sur codepad semble fonctionner. Je pense que c'est pas intuitif.
J'ai supprimé ma réponse parce que j'ai trouvé certains cas, où il donne de mauvaises réponses. Cela dit, je pense que le design est plus intuitif que celui-ci.
Il peut être standard >> pour obtenir des mots, mais pour ceux d'entre nous qui n'ont jamais traiter avec les fichiers texte de la norme n'est pas pertinent. Le point de mon discours d'ouverture, c'est que ce code exige seulement que l'utilisateur comprend très pièces de base de la langue.
C'est la réponse que j'aimerais voir comme un enquêteur. Lorsque vous demandez à quelqu'un de mettre en œuvre un algorithme trivial dans une interview, l'intervieweur est généralement d'essayer de voir si la personne peut écrire un morceau de code du plus bas niveau sainement, sans introduire de surcharge inutile, de la complexité ou de l'obscurcissement. Ils ne sont pas de tenter d'adopter une bite-du concours de mesure plus obscures les fonctionnalités de la bibliothèque ou de contester la personne interrogée à un jeu de code de golf.
OriginalL'auteur dash-tom-bang
En supposant que les mots sont séparés par des espaces:
Remarque: Il peut y avoir plus d'un espace entre les mots. Aussi cela ne veut pas attraper d'autres caractères blancs comme de l'onglet nouvelle ligne ou un retour chariot. Si le comptage des espaces n'est pas assez.
Le flux d'entrée de l'opérateur >> lorsqu'il est utilisé pour lire une chaîne de caractères à partir d'un flux. Lit-on dans un espace blanc mot séparé. Ils étaient donc probablement à la recherche pour vous de l'utiliser pour identifier les mots.
Quand pouvez l'utiliser pour compter le nombre de mots dans une chaîne de caractères.
Se complique:
Cours d'eau peut être traité comme tout autre récipient et y sont des itérateurs pour parcourir en boucle std::istream_iterator. Lorsque vous utilisez l'opérateur ++ sur un istream_iterator il suffit de lire les prochaines valeur du flux à l'aide de l'opérateur >>. Dans ce cas, nous sommes la lecture de std::string afin qu'il lit un espace séparé de parole.
En utilisant std::distance, tout encapsule tous les ci-dessus dans un paquet bien rangé comme il trouver la distance entre deux itérateurs en faisant ++ sur le premier jusqu'à ce que nous arrivons à la seconde.
Pour éviter la copie de la chaîne, nous pouvons être sournois:
Remarque: nous avons encore copie de chaque mot de l'original dans une mesure temporaire. Mais le coût est minime.
Err.. il est déraisonnable de demander à un programmeur C++ et attendre d'eux de ne pas connaître le C++. La bibliothèque standard est une partie de C++.
J'espère qu'il est facile pour n'importe qui de lire. Le point de l'ensemble d'une bibliothèque standard, c'est que tout le monde plutôt que d'inventer leur propre. Ainsi, même si vous ne saviez pas à propos de la distance que vous pourriez rechercher dans vingt secondes, le voir nous en utilisant les itérateurs en déduire que nous étions une itération à travers un ruisseau et des bobs votre oncle. Code déduit en 30 secondes.
Mon "opposition" est seulement à l'implication que chaque société a les mêmes besoins et exigences de votre propre. Mon secteur d'activité utilise généralement un sous-ensemble très strict de C++, et il est surprenant de trouver quelqu'un qui sait
<algorithm>
à tous, beaucoup moins dans l'aperçu. "Bibliothèque Standard" dans mon secteur "signifie" sans doute utile pour les personnes ayant des besoins différents que les nôtres."C'est le genre de question que je demande pour savoir si l'entretien ne sais la STL. Un bon candidat va faire (ou au moins utiliser les flux de diviser l'entrée en mots (comme c'est très fréquent)). Les meilleurs d'entre eux pourront utiliser std::distanace() les bons utilisera une boucle de ceux que nous n'avons pas de location seront ceux qui parse un mot par eux-mêmes.
OriginalL'auteur Martin York
Autre coup de pouce en fonction de la solution qui peut fonctionner (non testé):
Plus d'informations peuvent être trouvées dans le Stimuler La Chaîne Des Algorithmes De La Bibliothèque
Pourquoi pas? À moins que l'intervieweur demande spécifiquement pour une application qui n'utilise pas une grande quantité de stockage temporaire, ou qu'il ne devrait pas utiliser boost, puis je pense que c'est une bonne réponse. C'est certainement la plus lisible de toutes les solutions proposées et je pense que c'est un bon exemple de la idiomatiques C++.
Je voudrais aussi probablement continuer à leur demander comment ils pourraient la mettre en œuvre sans l'aide d'un vecteur de chaînes de caractères et sans coup de pouce. Un bon candidat doit être en mesure d'offrir les deux types de solution.
"Pendant qu'il fonctionne, ce n'est pas exactement ce que je serais à la recherche dans une interview." - vous voulez dire que vous seriez à la recherche de quelqu'un qui veut toujours écrit des choses le long chemin. 😉 Il serait utile pour moi, pour vous revenir sur votre commentaire.
OriginalL'auteur Christopher Hunt
Cela peut être fait sans rechercher manuellement à chaque personnage ou de la copie de la chaîne.
J'ai pris la liberté d'utiliser
isalnum
au lieu deisspace
.Ce n'est pas quelque chose que je ferais à l'entrevue d'emploi. (Ce n'est pas compilé la première fois.)
Ou, pour tous, le coup de pouce rageux ;v)
std::string::const_iterator
Aussi, tout sauf
size_t word_cnt…
etreturn…
pourrait aller à l'intérieur d'unfor
boucle.Cette réponse est impressionnant, mais, fondamentalement, illisible, et nécessite un lourd 3ème partie de la bibliothèque tristement célèbre pour exploser les temps de construire. Si quelqu'un a tenté cela sur une interview que je serais probablement passer sur eux.
Ouais le isalnum vs isspace est une question ouverte en raison de la nature ambiguë de l'OP, post; j'ai analysé comme "la ponctuation n'est pas un espace de sorte qu'il est considéré comme un caractère de mot."
Avec un peu de commentaires, il ne serait pas si mal, parce que le travail de la
transform_iterator
est assez simple. À l'aide demismatch
pour trouver les transitions de l'état est généralement utile. Certains programmeurs C++ sont aussi pointilleux sur si léger Boost composants sont permis...OriginalL'auteur Potatoswatter
Vous pouvez utiliser les std::count ou std::count_if de le faire. Ci-dessous un exemple simple avec std::count:
OriginalL'auteur TheArquitect
Un O(N) c'est aussi une solution très simple à comprendre et à mettre en œuvre:
(Je n'ai pas vérifié pour une chaîne vide d'entrée. Mais je suis sûr que vous pouvez le faire facilement.)
OriginalL'auteur totjammykd
Ici est un seul passage, sans branches (ou presque), les paramètres régionaux-connaissance de l'algorithme qui gère les cas avec plus d'un espace entre les mots:
Voici un exemple avec string = "Un très, très, très, très, très gros chien a mangé mes devoirs!!!!"
Explication
Voici 2 solutions je suis venu avec
Naïf solution
Si vous réfléchissez bien, vous serez en mesure de réduire cette série d'opérations dans un produit scalaire (juste pour le fun, je ne recommande pas ce que c'est sans doute beaucoup moins lisible).
Intérieure de solution de produit
OriginalL'auteur Lakshay Garg
Très concis O(N) approche:
Un divide-and-conquer approche, la complexité est également en O(N):
OriginalL'auteur sunjerry