我正在试图找出如何使用每个x位置重新排列字符串,以便输出字符串“ABCDEFGHI”和x为4将产生DHCIFEGBA。这是我如何得到的:
第一个字母很简单:字符为4. [A,B,C, D ]
第二个字母也很简单:字符为8. [E,F,G, H ]
第三个字母很容易:它是第3个字符3.这是因为我在计算时循环,因此我使用了I,A,B, C 。
第四个字母是事情变得棘手的地方:它是字符9.因为D和H已经消失,它们不会被计算使用,导致E,F,G,我。 />
字母#5遵循相同的模式,跳过C和D:A,B,E, F
字母#6有跳过和换行:G,A,B, E 。
字母#7再次包裹:G,A,B, G 。
字母#8也包装(技术上两次,因为'光标'在G之后:A,B,A, B
字母#9是我们的余数:A,A,A, A
它显然需要循环,直到输出字符串长度与输入字符串长度匹配 - 这是所有这些混乱在中间(主要是跳过和循环),我不能为我的生活弄清楚。
感谢任何帮助或指导。
答案 0 :(得分:2)
与独特的范围完美配合,但会失败,如ABCDEAFGHAI
$s = 'ABCDEFGHI';
$_len = strlen($s);
$out = '';
$c = 3;
echo '<pre>';
while ( $_len > 0 ) {
echo strlen($s) , ' :: '. $s . "\n";
$term = $s[$c-1];
list($a,$b) = explode($term, $s);
$s = $b.$a;
$x = strlen($s);
if($x <= $c) {
for($i=0; $i<($c-$x);$i++)
$s .= $s;
}
$out .= $term;
$_len--;
}
echo "\n\n\n" , $out;
输出:
9 :: ABCDEFGHI
8 :: EFGHIABC
7 :: IABCEFG
6 :: EFGIAB
5 :: ABEFG
4 :: GABE
6 :: GABGAB
4 :: ABAB
4 :: AAAA
DHCIFEGBA
希望更好的解决方案
function rearrangeString($string, $step = 4) {
$output = '';
$lenght = strlen($string);
if($step >= $lenght) {
return strrev($string);
} elseif($step < 1) {
return $string;
} else {
for($i=0; $i < $lenght; $i++) {
$_tempLen = strlen($string);
$output .= $string[$step-1];
list($a,$b) = explode($string[$step-1], $string);
$string = $b . $a;
$_tempLen = strlen($string);
if($step > $_tempLen) {
$string = str_repeat($string, $step-$_tempLen+1);
}
unset($_tempLen, $a, $b);
}
return $output;
}
}
$rearranged = rearrangeString('ABCDEFGHI');
var_dump($rearranged == 'DHCIFEGBA');
$rearranged = rearrangeString('ABCDEFGHI', 9);
var_dump($rearranged == 'IHGFEDCBA');
$rearranged = rearrangeString('ABCDEFGHI', 1);
var_dump($rearranged == 'ABCDEFGHI');
$rearranged = rearrangeString('ABCDEFGHI', 3);
var_dump($rearranged == 'CFIDHEBGA');
$rearranged = rearrangeString('ABCDEFGHI', 6);
var_dump($rearranged == 'FCAIBEHD');
$rearranged = rearrangeString('FARBE', 2);
var_dump($rearranged == 'ABFER');
答案 1 :(得分:0)
我会尝试这样,虽然我还没有测试过代码,但是:
$s = 'ABCDEFGHI';
$out = '';
While strlen($s) > 0 {
$pos = 4 % strlen($s);
$out += $s[$pos];
if (strlen($s) > 3) $end = 3;
else $end = strlen($s) - 1;
$s = substr($s, 4, strlen($s)) + substr($s, 0, $end);
}
echo $out;
答案 2 :(得分:0)
适用于任何$s
和$n
<?php
$s = "ABCDEFGHI";
$n = 4;
for ($i=0,$l=strlen($s) ; $l ; $l--)
{
$i = ($i+$n-1) % $l;
echo $s[$i];
$s = ($i ? substr($s, 0, $i) : '') . ($i < $l-1 ? substr($s, $i+1) : '');
}
echo "\n";
?>