私は本「Cracking the Coding Interview」に取り組んでおり、ここで回答を求める質問に出くわしましたが、私の回答と解決策を比較する助けが必要です. 私のアルゴリズムは機能しますが、本の解決策を理解するのに苦労しています。主な理由は、一部のオペレーターが実際に何をしているのか理解できないからです。
タスクは次のとおりです。「文字列にすべての一意の文字が含まれているかどうかを判断するアルゴリズムを実装します。追加のデータ構造を使用できない場合はどうなりますか?」
これが私の解決策です:
public static boolean checkForUnique(String str){
boolean containsUnique = false;
for(char c : str.toCharArray()){
if(str.indexOf(c) == str.lastIndexOf(c)){
containsUnique = true;
} else {
containsUnique = false;
}
}
return containsUnique;
}
うまくいきますが、これはどのくらい効率的ですか?Java の文字列のインデックス関数の複雑さは O(n*m) であることがわかりました
本からの解決策は次のとおりです。
public static boolean isUniqueChars(String str) {
if (str.length() > 256) {
return false;
}
int checker = 0;
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
}
return true;
}
私が解決策についてよく理解していないことがいくつかあります。まず、「|=」演算子は何をするのでしょうか? 「val」の値として、文字列の現在の文字から「a」が減算されるのはなぜですか? 「<<」がビットごとの左シフトであることは知っていますが、どう(checker & (1<<val))
すればよいでしょうか? 私はそれがビット単位であることを知っていますが、チェッカーが値を取得する行を理解していないため、理解していません。
私はこれらの操作に精通していません。残念ながら、この本では解決策について説明していません。おそらく、これらの操作を既に理解していることを前提としているためです。