//determines if string contains unique characters
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) <--- right here
return false;
checker |= (1 << val);
}
return true;
}
我所理解的是&lt;&lt;向二进制数添加额外的零,从而增加值。例如:2 <&lt; 3 = 10 + 000 = 10000 //二进制为16。所以我的问题是,这有什么用?这对我们如何帮助我们找到独特的角色
答案 0 :(得分:4)
算法有效,因为检查器变成了一个位图,告诉我们遇到了哪些字符。
我想我会用一个例子来解释。让我们说我们的字符串是&#39; bedb&#39;。
我们从checker = 0开始。
那么&#39; b&#39;谈到。 val == 1
因为'b' - 'a' == 1
。
(1&lt;&lt; val)以二进制表示为10。
checker | 10
= 00 | 10
= 10
这意味着我们遇到了一个b
(右起第二位有一个)并且没有遇到a
。
然后e
来了。 val == 4
。二进制文件中(1 << val)
为10000
。
checker | 10000
= 10 | 10000
= 10010
好。现在我们知道我们遇到了e
和b
。
d
之后,检查程序为11010
。
然后b
来了。 (1 << val)
是10
。此处(checker & (1 << val))
不再为零。
11010 & 10
是10
。
所以该方法返回false,因为它找到了之前遇到的字符。
答案 1 :(得分:1)
1)每个符号在单词中的位置为1,例如:a = 1,b = 10,c = 100,d = 1000 2)检查器保存之前呈现的每个符号的比特位置(检查器| =(1 <&lt;&lt; val) 3)如果符号已经保存,则相同位置的位为1,结果为:方程检查器&amp; (1&lt;&lt;&lt; val)将大于零(PROFIT),如果位置为0(当时没有相同的符号)则为零