我正在解决示例问题,同时尝试学习 Python %\... 但是我得到的问题书有 Java 中的问题和解决方案,所以我试图在两种语言之间来回转换。我刚刚了解了移位是如何工作的,我一直盯着这段代码,试图弄清楚第 5 行(和第 8 行)这里到底发生了什么......我试着写下一些示例,只是逐行查看代码但出于某种原因,它对我来说仍然不是很明显...... 有人可以澄清一下吗?
此外,据我所知,str.charAt(i) 返回一个字符对我来说真的很奇怪,然后您可以继续从另一个字符(例如数字)中减去它...将 int 应用于字符是否与 Python 中的 ord() 相同?
问题:实现一个算法来确定一个字符串是否包含所有唯一字符。
解决方案(在只有字符 a-z 的情况下):
1 boolean isUniqueChars(String str){
2 int checker = 0
3 for (int i = 0; i < str.length(); i++){
4 int val = str.charAt(i) - 'a';
5 if ((checker & (1 << val)) > 0){
6 return false;
7 }
8 checker |= (1 << val);
9 }
10 return true;
11 }
请您参考如下方法:
当然。此代码仅在 str 时有效其中只有小写字母。
checker是一个 32 位整数,您使用 32 位中的 26 位来记录 str 中是否存在特定字母.所以位 0 将用于记录 a 的存在,第 1 位将用于记录 b 的存在, 依此类推直到第 25 位,它将用于记录 z 的存在.
基本算法是通过str来工作的, 逐个字符。对于每个字符,在checker中找到对应的位.如果它已经被设置,这个字符一定是第二次出现 - 所以我们可以停止处理并返回 false .否则,设置该位。
如果您到达字符串末尾而没有发现任何重复字符,则返回 true .
神奇之处在于以下步骤。
- 减去
'a'将每个字符转换为 0 到 25 之间的数字。 - 符号
<<是“左移”运算符,它将位模式向左移动多个位。结果是1 << val是特定位(1、2、4、8 等)的位值。 - 符号
&执行二进制与,所以表达式checker & (1 << val)如果位val将为 0被清除,或等于1 << val如果已设置。 - 符号
|=做一个二进制或,并将结果分配给左边的变量。所以表达式checker |= (1 << val)设置位val.
