gpt4 book ai didi

java - 有人可以解释一下这段代码中如何使用移位吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:33 25 4
gpt4 key购买 nike

我正在解决示例问题,同时尝试学习 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 .

关于java - 有人可以解释一下这段代码中如何使用移位吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41798997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com