3

我很难理解这个检测字符串重复的代码。

int checker = 0;
    for(char ch : seed.toCharArray()){
        int val = ch - 'a';
        System.out.println(val);
        if ((checker & (1 << val)) > 0){ 
            // duplicate found
            break;
        }
        checker |= (1 << val);
    }

有人可以用一个例子解释我这是如何工作的吗?

4

2 回答 2

3

好的,比如说ch = 'c'

int val = 'c' - 'a' = 2; //The char value for 'c' is two greater that that for 'a'

然后评估if条件:

1 << 2

意思是“将 1 向左移动两位”,这给了我们二进制 100 或十进制 4。

checker & 4

表示检查器之间的“按位与”,即检查该特定位是否已设置。

如果该位被设置,我们就完成了,否则我们执行

c |= 4

这意味着“c = c | 4”,它是逐位的,或者会将与“c”对应的位设置为 1。

于 2012-07-17T08:00:23.767 回答
0

似乎它checker用作位图:'a' 的位 0,'b' 的位 1 等。它检查字母是否已经设置(checker & (1 << val)) > 0,如果不是,则设置它checker |= (1 << val)

于 2012-07-17T07:53:56.447 回答