// 顔質問45:アレイの最小数は配置 // タイトル:正の整数配列を入力し、すべての数字の配列は、プリント枚数が戦うことができ一緒にステッチに配置 // 最小限にデジタルインターフェースのすべてを。3入力配列{例えば、32、321}が、この数3印刷 // 321323に配置することができる単語の最小数。 #include " cstdioを" の#include < 文字列 > の#include <アルゴリズム> の#pragma(無効:4996)警告// VS少ない無視安全上の警告int型の比較(のconst 無効 * strNumber1、constの無効 * strNumber2); // int型ほとんどの10で10進数の整数で型のconst int型 g_MaxNumberLength = 10 ; CHAR G_StrCombine1 = * 新しい新しい CHAR [g_MaxNumberLength * 2 + 1 ]; CHAR * = g_StrCombine2 新しい新しい CHAR [g_MaxNumberLength * 2 + 1 ]; ボイド PrintMinNumber(CONST INT *数字、int型の長さ) { IF(番号== nullptr長|| <= 0 ) リターン; // 文字列にアレイ、二次元アレイ注** チャー ** strNumber =(CHAR **)(新しい新しい INT [長さ]); のための(INTI = 0 ; I <長さ。++ I) { strNumber [I] = 新しい CHAR [g_MaxNumberLength + 1 ]。 sprintf(strNumber [i]は、" %のD " 、数字[I])。 } のqsort(strNumber、長さはsizeof(CHAR * )、比較されたいです)。 以下のために(INT iが= 0 ; I <長さ; ++ I) のprintf(" %sの" 、strNumber [I])。 printf(" \ n個" ); 以下のための(int型= I 0、I <長さ; ++ i)は // 削除する2次元配列を作成するために覚えて 削除[] strNumber [I]、 [削除] [] strNumberを; } // もし[strNumber1] [strNumber2]> [ strNumber2] [strNumber1 ]、戻り値が0より大きい // もし[strNumber1] [strNumber2] = [ strNumber2] [strNumber1]、 戻り値が0に等しい // [strNumber1]が[strNumber2] <[場合 、strNumber2] [strNumber1] 0以上の値を返す INT比較します(CONST ボイド * strNumber1、CONST ボイド * strNumber2) { // [strNumber1] [strNumber2] strcpyの(g_StrCombine1、*(CONST チャー ** )strNumber1)。 strcatは(g_StrCombine1、 *(のconst のchar ** )strNumber2)。 // [strNumber2] [strNumber1] strcpyの(g_StrCombine2、*(CONST チャー ** )strNumber2)。 strcatは(g_StrCombine2、 *(のconst のchar ** )strNumber1)。 リターンのstrcmp(g_StrCombine1、g_StrCombine2)。 }
// ====================测试代码==================== 無効テスト(のconst のchar *テスト名、INT *数字、int型の長さ、CONST のchar * expectedResult) { もし!(テスト名= nullptr) のprintf(" %sは開始します:\ n " 、テスト名)を、 場合(!expectedResult = nullptr) のprintf(" 期待される結果は次のとおりです。\ T%sの\ nは" 、expectedResult)。 printf(" 実際の結果は次のとおりです。\ T " ); PrintMinNumber(数、長さ)。 printf(" \ n個" ); } ボイドTest1を() { int型の番号は[] = { 3、5、1、4、2 }。 試験(" Test1を"、数字、はsizeof(番号)/ はsizeof(INT)、" 12345 " )。 } ボイドTest2を() { int型の数[] = { 3、32、321 }。 テスト("TEST2 "数字、はsizeof(番号)/ はsizeof(INT)、" 321323 " ); } ボイドTest3は() { int型の数[] = { 3、323、32123 }; 試験(" Test3は"、数字、はsizeof(数字)/ はsizeof(INT)、" 321233233 " ); } ボイドTEST4() { int型の数[] = { 1、11、111 }; 試験(" TEST4 "、数字、はsizeof(番号)/ はsizeof(INT)、" 111111 " ); } // だけデジタルのアレイ 空隙TEST5行われるべきである() { int型の番号[] = { 321 }; テスト(" TEST5が実施されるべきである"、数字、はsizeof(番号)/ はsizeof(INT)、" 321 " ); } ボイドTEST6() { テスト("TEST6 "nullptr、 0は、" 何も印刷しないでください。" ); } int型のmain(int型 ARGC、CHAR * ARGV []) { Test1を(); Test2を(); Test3は(); TEST4(); TEST5(); TEST6(); 戻り 0 ; }
分析:高速ロウアルゴリズム。
クラス解決{ パブリック: ストリング PrintMinNumber(ベクトル< INT > 番号){ int型の長さ=(INT )numbers.size(); 文字列 strNumber = "" ; ソート(numbers.begin()、numbers.end()、比較)。 以下のために(INT iが= 0 ; I <長さ; ++ I) strNumber + = to_stringに(番号[I])。 返すstrNumberを。 } 静的 ブール(比較INT strNumber1、INT strNumber2) { 文字列 g_StrCombine1 = "" ; 文字列 g_StrCombine2 = "" ; // [strNumber1] [strNumber2] g_StrCombine1 + = to_stringに(strNumber1)。 g_StrCombine1 + = to_stringに(strNumber2)。 // [strNumber2] [strNumber1] g_StrCombine2 + = to_stringに(strNumber2)。 g_StrCombine2 + = to_stringに(strNumber1)。 リターン g_StrCombine1 < g_StrCombine2。 } }。