Cette tâche a déjà été posée / réparée, mais j'ai récemment eu un entretien d'embauche qui a imposé des défis supplémentaires pour démontrer ma capacité à manipuler des chaînes.
Problème: Comment inverser les mots dans une chaîne? Vous pouvez utiliser exemple: p> réponse: p> Strowpos () code>,
strallen () code> et
substr () code>, mais pas d'autres fonctions très utiles telles que
exploser () code>,
str devev () code>, etc. p>
$str = "I am a boy";
echo reverse_word($str) . "\n";
function reverse_word($input) {
//first find how many words in the string based on whitespace
$num_ws = 0;
$p = 0;
while(strpos($input, " ", $p) !== false) {
$num_ws ++;
$p = strpos($input, ' ', $p) + 1;
}
echo "num ws is $num_ws\n";
//now start grabbing word and store into array
$p = 0;
for($i=0; $i<$num_ws + 1; $i++) {
$ws_index = strpos($input, " ", $p);
//if no more ws, grab the rest
if($ws_index === false) {
$word = substr($input, $p);
}
else {
$length = $ws_index - $p;
$word = substr($input, $p, $length);
}
$result[] = $word;
$p = $ws_index + 1; //move onto first char of next word
}
print_r($result);
//append reversed words
$str = '';
for($i=0; $i<count($result); $i++) {
$str .= reverse($result[$i]) . " ";
}
return $str;
}
function reverse($str) {
$a = 0;
$b = strlen($str)-1;
while($a < $b) {
swap($str, $a, $b);
$a ++;
$b --;
}
return $str;
}
function swap(&$str, $i1, $i2) {
$tmp = $str[$i1];
$str[$i1] = $str[$i2];
$str[$i2] = $tmp;
}
4 Réponses :
$string = "I am a boy"; $reversed = ""; $tmp = ""; for($i = 0; $i < strlen($string); $i++) { if($string[$i] == " ") { $reversed .= $tmp . " "; $tmp = ""; continue; } $tmp = $string[$i] . $tmp; } $reversed .= $tmp; print $reversed . PHP_EOL; >> I ma a yob
Cette réponse manque à son explication éducative.
@MickMackusa - En effet. Comme c'est une question d'entrevue, je ne suis pas vraiment enclin à tout fournir ;-) En outre, je suis en désaccord avec la fermeture de la question; Ce n'est pas vraiment un duplicata de la question que vous avez attachée puisqu'il dispose de paramètres très spécifiques attachés. Beau travail ressusciter une question d'il y a une décennie - amusant.
Aucune réponse sur le débordement de la pile n'est jamais censée seulement parler à l'astucieux. Chaque réponse devrait inclure une explication pédagogique qui peut responsabiliser des milliers de chercheurs futurs. Je ne fais pas de discrimination par temps d'affichage pendant que je conduis mes routines de curation pour l'amélioration du débordement de la pile. Les anciennes pages sont utilisées pour fermer de nouvelles questions. Les anciennes réponses inexpliquées offrent peu de valeur à de nouveaux demandeurs qui veulent réellement apprendre comment et pourquoi une solution fonctionne.
whoops! Mal lire la question. Ici vous allez (notez que cela se séparera sur toutes les limites non-lettres, pas seulement de l'espace. Si vous voulez qu'un personnage ne soit pas divisé sur, ajoutez-le simplement à strong> Poignée maintenant UTF8 Caractères (simplement ajouter des caractères "Word" au $ WordCars code>):
$ Wordcharars code> String) ... p> p>
question interdit l'utilisation de STRREV ()
Bon pour gérer UTF-8. J'ai ajouté une solution aussi bien mais avec des chaînes et des chiffres réguliers.
Ma réponse consiste à compter la longueur de la chaîne, divisez les lettres dans un tableau, puis en boucle en arrière. C'est aussi un bon moyen de vérifier si un mot est un palindrome. Cela ne peut être utilisé que pour des chaînes et des chiffres réguliers.
Preg_Split peut être modifié pour exploser () également. P> blockQuote>
xxx pré> p>
Bien que non explicitement répertorié dans la question initiale, je suppose que d'utiliser Preg_split () code> est tout aussi interdit que
exploser () code>
divisé () code>, < Code> MB_Split () Code>, etc. En outre, je n'approuve pas l'opérateur de suppression d'erreur (
@ code>). Pourquoi avez-vous ignoré la chaîne d'échantillons de l'OP? Vos échantillons ne contiennent qu'un mot - ce n'est pas le défi.
sans utiliser de fonction.
$string = 'I am a boy'; $newString = ''; $temp = ''; $i = 0; while(@$string[$i] != '') { if($string[$i] == ' ') { $newString .= $temp . ' '; $temp = ''; } else { $temp = $string[$i] . $temp; } $i++; } $newString .= $temp . ' '; echo $newString;
Je n'approuve pas l'utilisation de l'opérateur STFU ( @ code>) car il indique une mauvaise manipulation des variables non présentes et donne au code une mauvaise odeur. Ceci est inexpliqué et une quasi-copie de la réponse acceptée.