我正在阅读“Cracking the Coding Interview”一书,在这里我遇到了一些寻求答案的问题,但我需要帮助来比较我的答案与解决方案。我的算法有效,但我很难理解书中的解决方案。主要是我不明白一些运营商到底在做什么。
任务是:“实现一个算法来确定一个字符串是否包含所有唯一字符。如果你不能使用额外的数据结构怎么办?”
这是我的解决方案:
public static boolean checkForUnique(String str){
boolean containsUnique = false;
for(char c : str.toCharArray()){
if(str.indexOf(c) == str.lastIndexOf(c)){
containsUnique = true;
} else {
containsUnique = false;
}
}
return containsUnique;
}
它有效,但效率如何?我看到Java中String的索引函数的复杂度是O(n*m)
这是书中的解决方案:
public static boolean isUniqueChars(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;
}
我对解决方案不太了解的几件事。首先,“|=”运算符是做什么的?为什么要从字符串中的当前字符中减去“a”以获得“val”的值?我知道“<<”是按位左移,但是有什么作用(checker & (1<<val))
呢?我知道它是按位的,但我不理解它,因为我不理解 checker 获取值的行。
我只是不熟悉这些操作,不幸的是这本书没有给出解决方案的解释,可能是因为它假设你已经理解了这些操作。