PHP

时间:2015-08-15 16:12:27

标签: php string string-matching

我在最近的一次采访中被问到了这个问题。 字符串包含a-z,A-Z和空格。对字符串进行排序,使所有小写字母都在开头,中间和大写字母的空格在末尾。较低和较高的案件之间的原始顺序需要保持不变。这就是我想出的:

$str = "wElComE to CaLiFOrNiA";

$lowercase ="";
$uppercase="";
$spaces="";

for ($i=0 ; $i <= strlen($str)-1 ; $i++)
{
    if ($str[$i] <= 'z' && $str[$i] >= 'a'  )
    {
        $lowercase .=$str[$i];
    }

    else if (($str[$i] <= 'Z' && $str[$i] >= 'A'))
    {
        $uppercase .=$str[$i];
    }
    else
    {
        $spaces.=$str[$i];
    }
}
echo $lowercase.$spaces.$uppercase;

input: wElComE to CaLiFOrNiA
output: wlomtoairi ECECLFONA

我想知道是否有更好的方法来做到这一点?输入字符串中有2个空格,输出只显示一个空格。这种复杂性是O(N)权利。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我确定有很多方法可以做到这一点。你可以用正则表达式来做..

$str = "wElComE to CaLiFOrNiA";
preg_match_all('~([a-z])~', $str, $lowercase);
preg_match_all('~([A-Z])~', $str, $uppercase);
preg_match_all('~(\h)~', $str, $spaces);
echo implode('', $lowercase[1]) . implode('', $spaces[1]) . implode('', $uppercase[1]);

输出:

wlomtoairi  ECECLFONA

当你说better是指你的表现,可读性还是别的什么?

第二种正则表达式方法:

$str = "wElComE to CaLiFOrNiA";
echo preg_replace('~[^a-z]~', '', $str) . preg_replace('~[^\h]~', '', $str) . preg_replace('~[^A-Z]~', '', $str);

答案 1 :(得分:0)

function sortString($string)
{
    $string_chars = str_split($string);

    $output = ['', '', ''];

    foreach ($string_chars as $char) {
       $output[$char === ' ' ? 1 : ($char === ucfirst($char) ? 2 : 0)] .= $char;
    }

    return implode('', $output);
}

echo sortString("wElComE to CaLiFOrNiA");

提供wlomtoairi ECECLFONA