Я работаю над книгой "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;
}
Это работает, но насколько это эффективно? Я видел, что сложность индексных функций для String в Java равна 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))
? Я знаю, что это поразрядно, но я не понимаю его, так как я не понимаю строку, в которой чекер получает значение.
Я просто не знаком с этими операциями, и, к сожалению, книга не дает объяснения решений, вероятно, потому, что предполагает, что вы уже понимаете эти операции.