Некоторое время назад во время собеседования я получил задачу изменить строку на PHP без использования strrev
.
Мое первое решение было примерно таким:
$s = 'abcdefg';
$temp = '';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$temp .= $s{$length - $i - 1};
}
var_dump($temp);
// outputs string(7) "gfedcba"
тогда они спросили меня, могу ли я сделать это без удвоения использования памяти (не используя переменную $temp
или любую переменную, чтобы скопировать обратную строку), и я потерпел неудачу.
Это продолжало прослушивать меня, и с тех пор я пытался решить это несколько раз, но я постоянно терпел неудачу.
Моя последняя попытка выглядит следующим образом:
$s = 'abcdefg';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$s = $s{$i * 2} . $s;
}
var_dump($s);
// outputs string(14) "gfedcbaabcdefg"
Это не решение отбросить "abcdefg" после цикла, потому что тогда я бы удвоил объем используемой памяти. Мне нужно удалить последний символ на каждой итерации цикла.
Я попытался использовать mb_substr
следующим образом:
$s = 'abcdefg';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$s = $s{$i * 2} . mb_substr($s, $length - $i - 1, 1);
}
var_dump($s);
но это только дает мне Uninitialized string offset
ошибки.
Вот где я застрял (снова). Я пробовал поиск по Google, но все решения я нашел либо echo
символов напрямую, либо использовал временную переменную.
Я также нашел проблему PHP String, не используя дополнительную память, но нет ответа, который бы соответствовал моим потребностям.