请帮助我了解For..Loop。 if语句在For循环语句中如何工作。我特别关注if语句以及以下语句的工作方式:if ((checker & (1 << val)) > 0) return false;checker |= (1 << val);

/* Assumes only letters a through z. */
    public static boolean isUniqueChars(String str) {
        if (str.length() > 26) { // Only 26 characters
            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;
    }

最佳答案

就像在帖子下方的评论中所说,checker变量用作26个值的布尔值,每个字母一个。

以下部分将字符转换为0到25之间的十进制表示形式(26个不同字母的26个可能值)

int val = str.charAt(i) - 'a';


因此,“ a”变为0,“ b”变为1,依此类推。

之后,if语句检查之前的字母是否已经出现,并通过检查字母值checker位置的val变量中的位是否已经设置为1来表示该字母已经存在字符串。

这是一个小示范:

tet

t -> 116 - 97 = 19
e -> 101 - 97 = 4
t -> 116 - 97 = 19

checker: 00000000000000000000000000

first iteration
   00000000000000000000000000 <- checker
 & 00000000000000000000000001 << 19
 ___________________________________

   00000000000000000000000000
 & 00000010000000000000000000
 ___________________________________
   00000000000000000000000000 = 0


second iteration
   00000010000000000000000000 <- checker
 & 00000000000000000000000001 << 4
 ___________________________________

   00000010000000000000000000
 & 00000000000000000000010000
 ___________________________________
   00000000000000000000000000 = 0


third iteration
   00000010000000000000010000 <- checker
 & 00000000000000000000000001 << 19
 ___________________________________

   00000010000000000000010000
 & 00000010000000000000000000
  ___________________________________
   00000010000000000000000000 = 524288 > 0


<<&|是按位运算符。在您的示例中,<<基本上将1移到左侧,然后&检查该点是否已经存在1。当然,这些是最简单的解释,但这就是您的示例中正在发生的事情。

它不在示例中,而是在每次迭代结束之前更新checker,以便将1设置为较低数字的位置变为checker中的设置。

在第三次迭代中,由于要检查的位置已经有一个1(在第一次迭代中设置了1),因此结果将在同一位置包含1,因此整个结果数将大于零,实际上是在if语句中进行检查。因此,如果数字大于0,则表示checker1的位置设置了val

您甚至可以在Wikipedia上找到有关按位运算符的更多有用信息。

就像我说过的,我尽了最大的努力简化了这个问题,这只是一个总的想法。

关于java - 实现一种算法以确定字符串是否具有所有唯一字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47956552/

10-10 09:53