「安全プランを証明する」50-タイトルII:文字の最初の文字列に一度だけ表示されます

// インタビューの質問50(2):文字の最初の文字列は一度だけ表示されます
 // タイトル:文字の最初の文字列は一度だけ表示されます見つけるための機能を実装してください。たとえば、とき
 // 時間の文字ストリームのみ最初の2つの文字を読み取って最初の文字は、一度だけ表示されます「G」で、「行きます」。文字場合は
 // 時間の文字ストリームは、「グーグル」最初の6つの文字を読み込み、最初の文字は「L」であるだけに一度表示されます。

#include <cstdioを> 
する#include <ベクトル> 
の#include <限界> 使用して名前空間STD; クラスCharStatistics 
{ パブリック
    CharStatistics():インデックス(0// = 0ハッシュテーブルを初期化し、コンストラクタのようなビットインデックス    {
         ためINT = I 0、I < 256

 



 I)
            発生[I] = - 1 ; 
    } 

    無効挿入(CHAR CH)   // ハッシュテーブルに現在の文字の挿入位置を
    {
         IF(発生[CH] == - 1// 全く存在しなかった 
            発生[CH] = インデックス。
          IF(発生[CH]> = 0// 一つまたは複数回の出現回数 
            発生[CH] = - 2 ;

         ++ 指数; 
    } 

    チャーFirstAppearingOnce()
    { 
        チャー CH = ' \ 0 '  INT minIndexのnumeric_limits = <整数 > :: MAX();   // int型の最大値

        のためにint型 I = 0 ; I < 256 ; ++ 私は)
        { 
            // 発生し、一度や文字の最前方位置
            IF発生( [I]> = 0 &&発生[I] < minIndex)
            { 
                CH =(チャー)Iが;   // 変換文字

                minIndex =出現[I];   // 更新最小位置
            } 
        } 
        戻りCH; 
    } 

プライベート// 発生[I]:ASCII値を持つ文字私は、
    // 発生[I] = -1:文字が見つかりませんでした。
    // 発生[I] = -2:文字mutlple回見出された
     // 発生[I]> = 0:文字は一度しか見出されている
    INT [発生256 ]。  // ハッシュ表
    int型のインデックス。  // 当前字符流的位数 
}。
// ====================测试代码==================== 
無効テスト(のconst  のchar *テスト名、CharStatisticsの文字、文字が期待される)
{ 
    もし!(テスト名= nullptr)
        のprintf(" %sが始まる:" 、テスト名)を、

    もし(chars.FirstAppearingOnce()== 予想)
        のprintf(" 合格\ n個。" );
    
        のprintf(" できませんでした。\ n。" ); 
} 

int型のmain(int型 ARGC、CHAR * ARGV [])
{
    CharStatisticsの文字。

    テスト(" Test1を"、文字、' \ 0 ' ); 

    chars.Insert(' G ' )。
    試験(" Test2を"、文字、' G ' )。

    chars.Insert(' O ' )。
    試験(" Test3は"、文字、' G ' )。

    chars.Insert(' O ' )。
    テスト(" TEST4 "G " ); 

    chars.Insert(' G ' )。
    テスト(" TEST5 "、文字、' \ 0 ' ); 

    chars.Insert(' L ' )。
    試験(" TEST6 "、文字、' L ' )。

    chars.Insert(' E ' ); 
    試験(" TEST7 "、文字、' L ' )。

    リターン 0 ; 
}
テストコード

分析:あなたは素敵な文字列を持つ複数のパスを必要とするハッシュテーブル。

クラス解決
{ 
パブリック
    
    ソリューション():インデックス(0 
    { 
        ためINT iは= 0 ; I < 256 ; ++ I)
            発生[I] = - 1 
    } 
    
    // 挿入にstringstreamから1つの文字
    ボイド挿入(チャーCH)
    { 
         場合(発生[CH] == - 1 
             発生[CH] = インデックス。
         他の 場合(発生[CH]> = 0 
             発生[CH] = - 2 
        
        ++ インデックス。
    } 
    // 現在にstringstreamの中チャー一度最初appearence戻り
    チャーFirstAppearingOnce()
    { 
        CHAR CH = ' ' int型 minIndex =のnumeric_limits < int型 > :: MAX(); 
        
        INT iは= 0 <; I 256 ; ++ I)
        { 
            場合(=出現[I]> 0 &&発生[I] < minIndex)
            { 
                CH =(CHAR )I。
                minIndex = 出現[I]。
            } 
        } 
        戻りCH。
    } 
 プライベートint型の出現[ 256 ]。
    int型のインデックス。
    
}。
ネットオフ牛は、コードを提出します

 

おすすめ

転載: www.cnblogs.com/ZSY-blog/p/12638459.html