剣は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、その他
何もありません。