トピック:文字の文字列の最初のは1度だけ表示して下さい。入力 "abaccdeff"、出力 'B'。
このタイトルを参照してください、私たちの最も直感的なアイデアは、文字の文字列をスキャンし、最初から開始することです。文字の後ろがない場合は、繰り返し文字と比較した各文字と文字の後ろを取るために、文字にアクセスすると、文字は一度だけ表示されています。文字列にn個の文字場合は、時間の複雑さのこのアイデアはO(N2)であるので、各文字は、O(n)の文字を比較したいの背中に関連している可能性があり、面接は思考のこの行に満足されることはありません、彼はに求めるメッセージが表示されます私たちは、より高速な思考を続けていきたいです。
この問題を解決するために、我々は、キーハッシュテーブル(キー)を定義することができ、文字、および値(バリュー)は、回文字が表示されますの数です。また、二度、文字列のスキャンを開始する必要があります。最初のスキャン文字列は、各文字は、対応する項目番号にハッシュテーブルに走査されるときに1秒だけ増加され、次のスキャンは、各走査文字がハッシュテーブルから取得することができます文字の出現回数。まず、このような文字が表示され、出力の要件を満たす唯一のものです。チャーは、256文字の合計8ビットタイプであるため、単純なハッシュテーブルは、要件を満たすことができるようになり得ます。我々は長さ256のアレイを作成するように、アレイのアレイ、及び数の添え字に対応するASCIIコードとして、その値に応じて各文字は、各文字が現れるためのアレイに記憶されます。だから我々は、キーハッシュテーブル用のASCII文字コードに256のサイズを作成しました。
ハッシュテーブルは、時間はO(1)で表示される文字の数を更新します。文字列の長さがNである場合、スキャン時間複雑度はO(N)である。同時に、補助アレイ256含む文字を必要とします、
import java.util.Scanner;
public class one{
/**
* @param args
*/
public static char FindChar(String str){
if(str == null){
return '.';
}
int[] hash = new int[256];//初始化hash数组
for(int i =0;i<hash.length;i++){
hash[i]=0;
}
for(int i =0;i<str.length();i++){
hash[str.charAt(i)] ++;
}
for(int i=0;i<str.length();i++){
if(hash[str.charAt(i)] == 1)
return str.charAt(i);
}
return '.';
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String str=in.next();
System.out.println(FindChar(str));
}
}
スペースの複雑さはO(1)であります