tips:本文章內(nèi)容來自《程序員編程藝術(shù):面試和算法心得》
給定一個字符串里面只有"R" "G" "B" 三個字符司志,請排序,最終結(jié)果的順序是R在前 G中 B在后降宅。
要求:空間復(fù)雜度是O(1)骂远,且只能遍歷一次字符串。
只是需要用到三個指針:一個前指針begin钉鸯,一個中指針current吧史,一個后指針end,current指針遍歷整個數(shù)組序列唠雕,當
current指針所指元素為0時贸营,與begin指針所指的元素交換,而后current++岩睁,begin++ 钞脂;
current指針所指元素為1時,不做任何交換(即球不動)捕儒,而后current++ 冰啃;
current指針所指元素為2時,與end指針所指的元素交換刘莹,而后阎毅,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++;//仔細想想為什么這里可以++
? ? ? ? ? ? ? ?}elseif('G' == *strCurrent){
? ? ? ? ? ? ? ? ? ? ? ? strCurrent++;
? ? ? ? ? ? ? ?}else{?
? ? ? ? ? ? ? ? ? ? ? ? swap(*strCurrent, *strEnd);
? ? ? ? ? ? ? ? ? ? ? ? strEnd--;
?}