.

На первых своих собеседованиях я этого не знал. А ведь разработчики не просто наблюдали за мной — они ожидали. Ожидали, что я буду действовать по следующему алгоритму:
Уточнить задание
- Спросите: «Что вы подразумеваете под словом палиндром?».
- Это отвечает на вопрос: приступит ли кандидат к решению задачи немедленно — даже не осознавая, что ее технические условия не ясны до конца? Или немного подумает и уточнит требования?»
«Мы имеем в виду такую последовательность, которая читается одинаково слева направо и справа налево. Ваше решение должно быть чувствительно к регистру: маленькая r не идентична большой R».
Начните с примеров
- Спросите: «В качестве примеров приведены слова «доход» и «шалаш». А что насчет фраз вроде «А роза упала на лапу Азора?». Что насчет пустой строки или строки из одного символа?
- Это отвечает на вопрос: примет ли кандидат во внимание достаточное количество пограничных случаев? Насколько точным и внимательным он будет?

Прежде чем приступить к описанию кода, кратко ознакомьте интервьюера с алгоритмом
Как кандидат подходит к решению проблемы? Проговаривает ли он свои мысли вслух, чтобы интервьюер их услышал?
Например,
string s = "alla"
.Мы можем воспользоваться вспомогательным методом для Строки Java, charAt(int i). Введите индекс строки в метод, и он выведет символ в таком индексе:
s.charAt(0) == 'a'
s.charAt(1) == 'l'
s.charAt(2) == 'l'
s.charAt(3) == 'a'
Чтобы узнать длину строки, можно использовать метод
length()
:s.length == 4
Чтобы узнать последний символ, можно использовать:
int len = s.length
s.charAt(len - 1)
Мы начали отсчет с 0, поэтому последний символ будет «длина минус 1».
Давайте назовем первый символ «first», а последний «last».
- Если первый символ s.charAt(first) не совпадает с s.charAt(last), то это не палиндром. Выводим false.
- Если первый символ s.charAt(first) совпадает с s.charAt(last), мы переходим к оценке следующего набора символов, сдвигаясь на один символ от «first» и от «last». Если все совпадает, вывести true.
- Проверив алгоритм вместе с интервьюером, можно приступать к написанию кода:
public boolean isPalindrome(String s) {
int first = 0;
int last = s.length() - 1;
while (first < last) {
if (s.charAt(first) != s.charAt(last)) {
return false;
}
first++;
last--;
}
return true;
}
Отладка и тестирование
- Возьмите изначальные тестовые примеры и попытайтесь представить: что произойдет, если вставить их в код.
- Интервьюеры проверяют вашу внимательность при отладке. (Заметите ли вы ошибки в собственном коде без подсказок со стороны?).
- Интервьюеры будут давать подсказки, если вы сумели произвести на них хорошее впечатление. (Если мы будем давать кандидату подсказки, воспользуется ли он ими? Готов ли он прислушаться к чужому мнению? Умеет ли он работать с людьми, занимающими более высокие должности?).
Покажите свой код другим людям и соберите их отзывы
Я показал свое решение задачи про палиндром своему другу-разработчику. Он скорчил гримасу: «Зачем ты использовал переменные «first» и «last»? И зачем задействовал цикл «loop», если можно обойтись «for»? Все можно было сделать короче, элегантнее и быстрее:
public boolean isPalindrome(String s) {
int len = s.length;
for (int i = 0; i < len / 2; i++) {
if ( s.charAt(i) != s.charAt(len - 1 - i)) {
return false;
}
}
return true;
}
Что дальше
Овладеть языком программирования в одночасье не получится. Поэтому лучше следовать такому алгоритму:
- Найти в интернете задачи по программированию базового уровня.
- Попробовать решить их с помощью бумаги и ручки.
- Если вы не можете их решить, ознакомьтесь с официальной документацией языка программирования и посмотрите, какие встроенные методы могут помочь вам.
- Сформулируйте собственное решение перед тем, как искать чужое. Если вы сами будете собирать информацию и изучать ее, появится вероятность того, что эта информация навсегда осядет в вашей голове.
- Не устраивайте сеансы зубрежки. Так вы просто сохраните информацию в краткосрочной памяти.
- Практикуйтесь короткими заходами, по 15 минут в день. Так информация переместится в долгосрочную память, и вы сможете вспомнить ее даже при экстремальном стрессе на собеседовании.
- Не подвергайте себя всем этим мучениям только ради того, чтобы пройти тест на доске. Цельтесь выше! Поставьте перед собой задачу стать более профессиональным программистом!
Комментарии (7)
sergyx
20.12.2019 02:24Еще важно показывать код правильным людям, а не любителям закодировать максимум логики в минимум строк кода.
Код вашего друга получился короче, но не элегантнее, а неряшливее.
Вот это просто ужас:
if ( s.charAt(i) != s.charAt(len - 1 - i))
jknight
20.12.2019 18:07А что здесь такого-то? Сложно себе представить разработчика, у которого вызовет сложности эта строка.
donRumatta
21.12.2019 14:26Как по мне, так первый вариант тоже предпочтительней. Со временем понимаешь, что в большинстве случаев код должен быть прост как пять копеек, чтобы по прошествии года ты мог вернуться и читать его, не спотыкаясь (уже молчу про коллег).
Deosis
20.12.2019 07:14Это отвечает на вопрос: приступит ли кандидат к решению задачи немедленно — даже не осознавая, что ее технические условия не ясны до конца? Или немного подумает и уточнит требования?»
Выглядит как способ завалить кандидата на собеседовании:
Не спросил — плохо.
Спросил — плохо, так как не знает базовых вещей.alex_zzzz
20.12.2019 14:08Вопросы не про базовые вещи. Если их не задавать, можно потратить время на код, который сам по себе работает правильно, только делает не то и не так. Даже если попросили написать FizzBuzz, имеет смысл кое-что уточнить.
TheKnight
У меня в команде есть локальный мем «Если хочешь начать автоматизировать тестирование — проверь строку на палиндром».
И тут вы со своей статьей.