tips:本文章內(nèi)容來自《程序員編程藝術(shù):面試和算法心得》
給定一個字符串里面只有"R" "G" "B" 三個字符,請排序,最終結(jié)果的順序是R在前 G中 B在后。
要求:空間復(fù)雜度是O(1),且只能遍歷一次字符串。
只是需要用到三個指針:一個前指針begin,一個中指針current,一個后指針end,current指針遍歷整個數(shù)組序列,當(dāng)
current指針?biāo)冈貫?時,與begin指針?biāo)傅脑亟粨Q,而后current++,begin++ ;
current指針?biāo)冈貫?時,不做任何交換(即球不動),而后current++ ;
current指針?biāo)冈貫?時,與end指針?biāo)傅脑亟粨Q,而后,current指針不動,end-- 。
參考代碼:
/**
*荷蘭國旗問題
*/
void helanguoqi (char* str,unsigned long length){
? ? ? if(NULL== str || 0== length)
? ? ? ? ? ? ? ? return;
? ? ? char* strBegin = str;
? ? ? char* strCurrent = str;
? ? ? char* strEnd = str+length-1;
? ? ? while(strCurrent < strEnd) {
? ? ? ? ? ? ? if('R' == *strCurrent) {
? ? ? ? ? ? ? ? ? ?swap(*strBegin, *strCurrent);
? ? ? ? ? ? ? ? ? ?strBegin++;
? ? ? ? ? ? ? ? ? ?strCurrent++;//仔細(xì)想想為什么這里可以++
? ? ? ? ? ? ? ?}elseif('G' == *strCurrent){
? ? ? ? ? ? ? ? ? ? ? ? strCurrent++;
? ? ? ? ? ? ? ?}else{?
? ? ? ? ? ? ? ? ? ? ? ? swap(*strCurrent, *strEnd);
? ? ? ? ? ? ? ? ? ? ? ? strEnd--;
?}