我有一个我在网上找到的程序,基本上告诉我是否String包含所有唯一字符,下面是代码
private static boolean areCharsUnique(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;
}
Run Code Online (Sandbox Code Playgroud)
我被这行代码困惑if ((checker & (1 << val)) > 0),也
checker |= (1 << val);
我知道这<<是一个左移操作员,但在上述情况下左移的确切程度如何?
总之,上述计划如何运作?
此代码的工作原理是ASCII字符集在其映射中具有连续字符a == 97, b == 98,以此类推.
从此开始,您可以计算a角色的增量距离,例如'e' - 'a' = 5.该距离用于设置(通过checker |= (1 << val))整数(具有32位)的位.
因此,如果'e'找到一个字符,则将索引5处的位设置为1 checker.
通过确保您永远不会找到之前已设置的位(通过if (checker & (1 << val)) > 0)),可以对每个字符进行此操作.
这仅适用于小写字符(即使因为int有32位).一个HashSet<Character>是肯定更好.
| 归档时间: |
|
| 查看次数: |
1068 次 |
| 最近记录: |