4

ループ内の行がわかりません。文字を取得して減算aするので、「10」ですか?(なぜ?)
次に1 << val:1をvalだけシフトしますか?(なぜ?)
そしてチェッカーは0ですが、どのように> 0してその状態に到達するのでしょうか?

    public static boolean isUniqueChars(String str) {
    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;
}

ありがとう

4

3 に答える 3

8

コードは がstr小文字で構成されていると想定し、文字の繰り返しがない場合は true を返します。それはこのように動作します:

checkerはビットマップとして使用されます。つまり、この変数の各ビットは、1 つの文字を追跡するために使用されます。文字から「a」を引くと、「a」の場合は 0、「b」の場合は 1、「c」の場合は 2 などになります。この数だけ左に 1 シフトすると、「a」の場合は 1、「b」の場合は 2、「c」の場合は 4 になります。 」など

|この値をコードとoring ( ) することによりchecker、以前に遭遇した文字を追跡します。したがって、たとえば 2 番目の 'a' に遭遇した場合、checker最初のビットが設定されているため (if ステートメントでテストされます)、重複&があることがわかります。str

つまり、checkerbool のより高速でコンパクトな配列として使用されます。これと同様の手法は、ビット操作と呼ばれます。

于 2012-05-28T12:38:38.437 に答える
1

str.charAt(i) - 'a'多かれ少なかれ、「アルファベットの文字」str.charAt(i)を返し'a'ます。0'b'val1zval25

この残りの部分は、ビットいじりのテクニックを使用してvalいます。のth ビットが設定されている場合に限り、 は非ゼロです。これは、その文字を既に認識していることを意味します。それ以外の場合は、 のth ビットを設定してループを続行します。checker1valchecker & (1 << val)valcheckervalchecker

于 2012-05-28T12:37:56.113 に答える