6

このタスクはすでに質問/回答されていますが、最近、文字列を操作する能力を実証するためにいくつかの追加の課題を課す就職の面接がありました。

問題:文字列内の単語を逆にする方法は?strpos()、、strlen()およびを使用できますが、、substr()などの他の非常に便利な関数は使用できません。explode()strrev()

例:

$string = "I am a boy"

答え:

I ma a yob

以下は、2日[ため息]かかった私の作業コーディングの試みですが、よりエレガントで簡潔な解決策が必要です。

目的:

1. get number of words
2. based on word count, grab each word and store into array
3. loop through array and output each word in reverse order

コード:

$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

4 に答える 4

16
$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
于 2010-06-04T20:36:18.957 に答える
2

おっと!質問を読み間違えました。ここに進みます(これは、スペースだけでなく、文字以外のすべての境界で分割されることに注意してください。文字が分割されないようにする場合は、に追加するだけです$wordChars):

function revWords($string) {
    //We need to find word boundries
    $wordChars = 'abcdefghijklmnopqrstuvwxyz';
    $buffer = '';
    $return = '';
    $len = strlen($string);
    $i = 0;
    while ($i < $len) {
        $chr = $string[$i];
        if (($chr & 0xC0) == 0xC0) {
            //UTF8 Characer!
            if (($chr & 0xF0) == 0xF0) {
                //4 Byte Sequence
                $chr .= substr($string, $i + 1, 3);
                $i += 3;
            } elseif (($chr & 0xE0) == 0xE0) {
                //3 Byte Sequence
                $chr .= substr($string, $i + 1, 2);
                $i += 2;
            } else {
                //2 Byte Sequence
                $i++;
                $chr .= $string[$i];
            }
        }
        if (stripos($wordChars, $chr) !== false) {
            $buffer = $chr . $buffer;
        } else {
            $return .= $buffer . $chr;
            $buffer = '';
        }
        $i++;
    }
    return $return . $buffer;
}

編集:これは単一の関数であり、バッファーを逆表記で単純に格納します。

Edit2: UTF8文字を処理するようになりました(文字列に「単語」文字を追加するだけ$wordCharsです)...

于 2010-06-04T20:37:50.940 に答える
-2

私の答えは、文字列の長さを数え、文字を配列に分割してから、逆方向にループすることです。これは、単語が回文であるかどうかを確認するための良い方法でもあります。これは、通常の文字列と数字にのみ使用できます。

preg_splitをexplode()に変更することもできます。

/**
 * Code snippet to reverse a string (LM)
*/

$words = array('one', 'only', 'apple', 'jobs');

foreach ($words as $d) {
    $strlen = strlen($d);
    $splits = preg_split('//', $d, -1, PREG_SPLIT_NO_EMPTY);

    for ($i = $strlen; $i >= 0; $i=$i-1) {
        @$reverse .= $splits[$i];
    }

    echo "Regular: {$d}".PHP_EOL;
    echo "Reverse: {$reverse}".PHP_EOL;
    echo "-----".PHP_EOL;
    unset($reverse);
}
于 2015-06-09T02:24:29.983 に答える
-3

関数を使用せずに。

$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;

出力:私はヨブです

于 2019-09-30T06:13:56.813 に答える