6
votes

Reverser les lettres dans chaque mot d'une chaîne sans utiliser de fractionnement ni de fonctions d'inversion natives

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 Strowpos () code>, strallen () code> et substr () code>, mais pas d'autres fonctions très utiles telles que exploser () code>, str devev () code>, etc. p>

exemple: p> xxx pré>

réponse: 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;
}


0 commentaires

4 Réponses :


16
votes
$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

3 commentaires

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.



2
votes

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 à $ WordCars ): xxx

EDIT: C'est une seule fonction, et stocke la mémoire tampon naïvement dans la notation inversée.

Poignée maintenant UTF8 Caractères (simplement ajouter des caractères "Word" au $ Wordcharars String) ...


2 commentaires

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.



-2
votes

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. xxx


1 commentaires

Bien que non explicitement répertorié dans la question initiale, je suppose que d'utiliser Preg_split () est tout aussi interdit que exploser () divisé () , < Code> MB_Split () , etc. En outre, je n'approuve pas l'opérateur de suppression d'erreur ( @ ). 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.



-3
votes

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;


1 commentaires

Je n'approuve pas l'utilisation de l'opérateur STFU ( @ ) 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.