////////////////////////////////////////////////// ////////////////////////////
// 6.タイトルIV:スペースを置き換える
//実現される機能を確認し、文字列の各"20%"とスペースを置き換える;例えば、次のように入力します。 - > "我々はハッピー!" "私達%20Are%20Happy!"
// O(n)との時間複雑性は、空間的な複雑さはO(1)
CHAR * StrReplace(CHAR * pszStr、int型 ILEN、チャー CH、CONST のchar * pszReStr) { アサート(pszStr = NULL && pszReStr = NULL && ILEN> =!0 ); CHAR * PTMP = pszStr; INT iFindNum = 0 ; // 1. CH文字列の数を検索し ながら、(* = PTMPを!' \ 0 ' ) { IF(PTMP ++ == * CH) { iFindNum ++ ; } } //2.新しい文字列の長さ int型 iOldLen = strlen関数(pszStr); int型 iReLen = strlen関数(pszReStr); int型 iNewLen = iOldLen +(iReLen - 1)* iFindNum; // この文字列の長さを交換する1デクリメントされる-元の文字の長さ であればに(iNewLen> ILEN) { リターンNULL; } // バック文字列から3.割り当て // 私は存在しない理由= iOldLen - 1; - >コピー'\ 0'最後の; のため(int型 I = iOldLen。 I> = 0 && iNewLen> Iであり; i-- ) { IF(pszStr [I] == CH) { ため(INTJ = iReLen - 1。J> = 0 ; j-- ) { pszStr [iNewLen - ] = pszReStr [J]。 } } 他 { pszStr [iNewLen - ] = pszStr [I]。 } } の#if 0 ながら(iOldLen> = 0 && iNewLen> iOldLen) { 場合(pszStr [iOldLen] == CH) { ため(int型 I = iReLen - 1 ; I> = 0 ; i--) { pszStr [iNewLen - ] = pszReStr [I]。 } } 他 { pszStr [iNewLen - ] = pszStr [iOldLen]。 } iOldLen - 。 } #endifの 戻りpszStrと、 } ボイドStrReplaceTestFunc() { COUT << " \ n \ n --------------- StrReplaceTestFuncスタート--------------> " << ENDL ; const int型 MAX_STR_LEN = 128 ; チャー szStr [MAX_STR_LEN] =「私たちは幸せです!」。 StrReplace(szStr、MAX_STR_LEN、' '、" 20%" )。 裁判所未満 << " 筋力:" << szStr << てendl; StrReplace(szStr、MAX_STR_LEN、' !'、" -------> " ); 裁判所未満 << " 筋力:" << szStr << てendl; 裁判所未満 << " \ N \ N --------------- StrReplaceTestFunc終了--------------> " << てendl; }
////////////////////////////////////////////////// /////////////////
4つのトピックに関連するトピックについて// 2
// 2ソートされた配列A1、A2、A1の終わりA2を収容するのに十分なスペースがある、達成機能、A2、A1は、すべての数字と秩序のすべての数字を挿入します!
@ 方法:比較を前面から背面に、追加のスペースが必要とされる // 時間の複雑性O(2N)、Oの空間的な複雑さ(N-) のボイド MergeTwoArray1(int型 aiArrayA []、int型 iNumA、INT aiArrayB []、int型iNumB) { CONST INT MAX_ARRAY_COUNT + = iNumA iNumB; ベクター < INT > VECT(MAX_ARRAY_COUNT、0 ); int型私は= 0 J =、0 K = 0 ; // 2つの配列の比較1、小さい追加された新しい配列 一方、(私は<iNumA && J < iNumB) { IF(aiArrayA [I] < aiArrayB [J]) { VECT [K ++] = aiArrayA [I ++ ]; } 他 { VECT [K ++] = aiArrayB [J ++ ]; } } // 2の新しい配列に加え、残りの要素 ながら(私は< iNumA)を { VECT [ K ++] = aiArrayA [I ++ ]; } ながら(J < iNumB) { VECT [K ++] = aiArrayB [J ++ ]; } // アレイ3. Aにデータをコピー K = 0 ; のための(自動IT: VECT) { aiArrayA [K ++] =IT; } } // 方法2:余分なスペース、バックから比較 // Oの時間複雑度(n)は、空間的複雑度は、O(1) ボイド MergeTwoArray2(INT aiArrayA []、INT iNumA、INT aiArrayB []、INT iNumB) { int型 iNewNum = iNumA iNumB + - 1。; int型 I = iNumA - 1。; INT J = iNumB - 1。; // フォワード比較アレイから、重なりが存在しません!!! 一方、(I> = 0 && J> = 0 ) { IF(aiArrayA [I]> aiArrayB [J]) { AiArrayA [iNewNum - ] = aiArrayA [i-- ]。 } エルス { aiArrayA [iNewNum - ] = aiArrayB [j-- ]。 } } ながら(I> = 0 ) { [iNewNum aiArrayA - ] = aiArrayA [i-- ]。 } 一方(J> = 0 ) { aiArrayA [iNewNum - ] = aiArrayB [j-- ]。 } } ボイドMergeTwoArrayTestFunc() { COUT << "\ N \ N --------------- MergeTwoArrayTestFuncスタート--------------> " << てendl; constの int型 MAX_ARRAY_COUNT_A = 30 ; のconst int型 MAX_ARRAY_COUNT_B = 10 ; int型 aiArrayA [MAX_ARRAY_COUNT_A] = { 0 ;} int型 aiArrayB [MAX_ARRAY_COUNT_B] = { 0 }; INITIALIZE_ARRAY(aiArrayA、MAX_ARRAY_COUNT_B); INITIALIZE_ARRAY(aiArrayB、MAX_ARRAY_COUNT_B); STD ::ソート(aiArrayA、aiArrayA + MAX_ARRAY_COUNT_B)を、 STD ::ソート(aiArrayB、aiArrayB + MAX_ARRAY_COUNT_B)。 TRAVERSAL_ARRAY(aiArrayA、MAX_ARRAY_COUNT_B)。 TRAVERSAL_ARRAY(aiArrayB、MAX_ARRAY_COUNT_B)。 // MergeTwoArray1(aiArrayA、MAX_ARRAY_COUNT_B、aiArrayB、MAX_ARRAY_COUNT_B)。 MergeTwoArray2(aiArrayA、MAX_ARRAY_COUNT_B、aiArrayB、MAX_ARRAY_COUNT_B)。 TRAVERSAL_ARRAY(aiArrayA、MAX_ARRAY_COUNT_A)。 裁判所未満 << " \ N \ N --------------- MergeTwoArrayTestFuncスタート--------------> " << てendl; }