不带 strrev 的反向字符串

2022-08-30 12:20:43

前段时间,在一次求职面试中,我得到了一个任务,在不使用的情况下反转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

这就是我(再次)陷入困境的地方。我尝试谷歌搜索,但所有的解决方案我要么直接找到字符,要么使用临时变量。echo

我还发现问题PHP字符串反转而不使用额外的内存,但没有适合我需求的答案。


答案 1

这是一个有趣的问题。这是我刚刚想到的:

$s = 'abcdefghijklm';
for($i=strlen($s)-1, $j=0; $j<$i; $i--, $j++) {
    list($s[$j], $s[$i]) = array($s[$i], $s[$j]);
}
echo $s;

list()可用于在一次操作中分配变量列表。所以我正在做的是简单地交换字符(从第一个和最后一个开始,然后是第二个第一个和倒数第二个,依此类推,直到它到达字符串的中间)

输出为 。不使用除计数器以外的任何其他变量,所以我希望这符合您的标准。mlkjihgfedcba$s


答案 2

您可以使用这样一个事实,即在PHP中可以将字符串视为字符数组

然后,基本上您要做的是将字符串中间左侧的每个字符替换为中间右侧的字符,其距离相同。$i$j

例如,在包含 7 个字符的字符串中,中间字符位于位置 3 上。位置 0(距离 3)上的字符需要与位置 6 (3 + 3) 上的字符交换,位置 1 上的字符(距离 2)需要与位置 5 (3 + 2) 上的字符交换,依此类推。

此算法可以按如下方式实现:

$s = 'abcdefg';

$length = strlen($s); 
for ($i = 0, $j = $length-1; $i < ($length / 2); $i++, $j--) {
    $t = $s[$i];
    $s[$i] = $s[$j];
    $s[$j] = $t;
}

var_dump($s);

推荐