2015-08-15 57 views
0

在最近的一次采访中,我被问到了这个问题。 一个字符串包含a-z,A-Z和空格。对字符串进行排序,以便所有小写字母都位于开头,中间位置和大写字母位于最后。小写和大写之间的原始顺序需要保持不变。这是我想出了:在PHP中使用大写和小写字符串操作

$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)的复杂性。

任何想法?

+1

如果你看一下HTML输出的空间进行了优化。查看html源代码来查看所有空格。 – hellcode

+0

有趣,我不知道为什么html正在优化空间。我打印输出字符串,如果字符串中有空格,它应该正确显示正确吗? –

+0

因此,你应该使用:'echo“

".$lowercase.$spaces.$uppercase."
”;' – hellcode

回答

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); 
+0

感谢您的解决方案。我正在寻找更好的表现。我们可以优化它吗? ?目前它是O(n) –

+0

正则表达式需要'0.00049'秒运行,循环需要'0.000143'秒运行。 https://eval.in/417178 – chris85

+0

嗯运行在eval基准每次都会带来不同的时间。 preg_replace虽然回来速度更快。 – chris85

0

我认为您的解决方案是非常好的,但如果你到微优化,你可以做一些小的改动。以下是比正则表达式的解决方案上面(基准运行10000次),至少在我的系统速度更快:

$str = "wElComE to CaLiFOrNiA"; 
$lowercase = ""; 
$uppercase = ""; 
$spaces = ""; 

$end = strlen($str); // Calculate length just once 
for ($i = 0; $i < $end; $i++) { 
    $c = $str[$i]; // Get $str[$i] once 

    // We know there are only A-Z, a-z and space chars so we 
    // only need a greater-than check ('a' > 'A' > ' ') 
    if ($c >= 'a') { 
     $lowercase .= $c; 
    } else if ($c >= 'A') { 
     $uppercase .= $c; 
    } else 
     $spaces .= $c; 
} 
echo $lowercase . $spaces . $uppercase, PHP_EOL; 
+0

谢谢你的优化:) –

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

相关问题