Напишите функцию, которая проверяет, содержит ли строка все буквы английского алфавита
Что проверяют
Аккуратность в мелочах: как вы нормализуете регистр, что считаете буквой и как отсекаете лишние символы. Задача про панграмму, и по решению видно, привык ли кандидат к множествам и битовым маскам или тянет в ответ перебор строки поиском по каждой букве.
Как отвечать
Простой и понятный вариант: пройти строку один раз, складывать латинские буквы в Set и выйти досрочно, когда набралось двадцать шесть.
function isPangram(s) {
const seen = new Set();
for (const ch of s.toLowerCase()) {
if (ch >= "a" && ch <= "z") {
seen.add(ch);
if (seen.size === 26) return true;
}
}
return false;
}Проговорите оценки: время O(n), память константная, потому что множество не растёт больше алфавита. Упомяните вариант на битовой маске: сдвигаем единицу на ch.charCodeAt(0) - 97, накапливаем в числе через |= и сравниваем с маской из двадцати шести единиц. Он быстрее и не аллоцирует, а заодно показывает, что вы понимаете коды символов. Вариант через alphabet.every((c) => s.includes(c)) тоже верный, но он проходит строку двадцать шесть раз, и лучше сказать об этом раньше интервьюера.
Где спотыкаются
Строят множество из всех символов строки и сравнивают его размер с числом двадцать шесть. Пробелы, цифры и запятые попадут в то же множество, и предложение без единой буквы x, но с парой знаков препинания, гордо объявляется панграммой. Фильтровать нужно до подсчёта.
Проверяют решение на самодельных примерах. Фраза про быстрое движение противника, где вместо слова «шесть» стоит «пять», теряет букву x и панграммой не является, но её регулярно приводят как положительный тест. Проверяйте примеры кодом, а не памятью.
Игнорируют Unicode и локаль. Кириллица и латиница здесь разные наборы, а toLocaleLowerCase в турецкой локали превращает I не в ту букву, из-за чего проверка ломается ровно у части пользователей. Поэтому берут toLowerCase без локали и явно проговаривают, что алфавит английский.