剣はオファーを指します—50_2。文字ストリームの最初の繰り返されない文字—分析とコード(Java)

剣はoffer-50_2を指します。文字ストリームの最初の繰り返されない文字-分析とコード[Java]

1.タイトル

タイトル説明
文字ストリームに1回だけ出現する最初の文字を検索する関数を実装してください。たとえば、最初の2文字の「go」が文字ストリームから読み取られる場合、1回だけ表示される最初の文字は「g」です。文字ストリームから最初の6文字「google」を読み取る場合、1回だけ表示される最初の文字は「l」です。
出力の説明:
現在の文字ストリームに1回出現する文字がない場合は、#文字が返されます。

2、分析とコード

1.ハッシュテーブル

(1)考える

この質問は、質問50と同じ考えで解決できます。文字ストリームを入力するプロセスで、文字がO(1)時間計算量内に出現および記録されたかどうかを判断し、全体の複雑さをO(n)で制御します。 。
このアイデアはハッシュテーブルと組み合わせて実現でき、最適化できるポイントは2つあります
。1)文字数に制限があり、ASCIIコードと組み合わせて直接連続数に変換できるため、ハッシュテーブル配列関数で実現可能;
2)ハッシュテーブルに表示される文字数を記録する場合は、文字の位置を再度トラバースする必要があるため、文字の位置を直接記録し、繰り返し文字を記録することができます。たとえば、最初に出現する文字の位置が記録され、繰り返し出現する文字が-2として記録されるため、1回のトラバースで必要な回答を得ることができます。

(2)コード

public class Solution {
    
    
    int[] chars = new int[128];
    int index = 1;
    
    //Insert one char from stringstream
    public void Insert(char ch)
    {
    
    
        if (chars[ch] == 0)
            chars[ch] = index++;
        else
            chars[ch] = -1;
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
    
    
        int index = 0;
        char ans = '#';
        for (int i = 0; i < 128; i++)
            if (chars[i] > 0 && (index == 0 || index > chars[i])) {
    
    
                index = chars[i];
                ans = (char)i;
            }
        return ans;
    }
}

(3)結果

実行時間:12ミリ秒、占有メモリ:9552k。

3、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/109267028