2015-08-15 83 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

相關問題