Привет, хабровчане. В преддверии старта курса «Java QA Engineer» делимся с вами продолжением вот этого материала
.
![](https://habrastorage.org/r/w1560/webt/ql/c1/ai/qlc1aisipdajy4tki28cnpmnqiw.png)
На первых своих собеседованиях я этого не знал. А ведь разработчики не просто наблюдали за мной — они ожидали. Ожидали, что я буду действовать по следующему алгоритму:
Уточнить задание
«Мы имеем в виду такую последовательность, которая читается одинаково слева направо и справа налево. Ваше решение должно быть чувствительно к регистру: маленькая r не идентична большой R».
Начните с примеров
![](https://habrastorage.org/r/w780q1/webt/sl/69/ye/sl69yeqpguiw8mpdvgsomq6_qcy.jpeg)
Как кандидат подходит к решению проблемы? Проговаривает ли он свои мысли вслух, чтобы интервьюер их услышал?
Например,
Мы можем воспользоваться вспомогательным методом для Строки Java, charAt(int i). Введите индекс строки в метод, и он выведет символ в таком индексе:
Чтобы узнать длину строки, можно использовать метод
Чтобы узнать последний символ, можно использовать:
Мы начали отсчет с 0, поэтому последний символ будет «длина минус 1».
Давайте назовем первый символ «first», а последний «last».
Я показал свое решение задачи про палиндром своему другу-разработчику. Он скорчил гримасу: «Зачем ты использовал переменные «first» и «last»? И зачем задействовал цикл «loop», если можно обойтись «for»? Все можно было сделать короче, элегантнее и быстрее:
Овладеть языком программирования в одночасье не получится. Поэтому лучше следовать такому алгоритму:
.
![](https://habrastorage.org/webt/ql/c1/ai/qlc1aisipdajy4tki28cnpmnqiw.png)
На первых своих собеседованиях я этого не знал. А ведь разработчики не просто наблюдали за мной — они ожидали. Ожидали, что я буду действовать по следующему алгоритму:
Уточнить задание
- Спросите: «Что вы подразумеваете под словом палиндром?».
- Это отвечает на вопрос: приступит ли кандидат к решению задачи немедленно — даже не осознавая, что ее технические условия не ясны до конца? Или немного подумает и уточнит требования?»
«Мы имеем в виду такую последовательность, которая читается одинаково слева направо и справа налево. Ваше решение должно быть чувствительно к регистру: маленькая r не идентична большой R».
Начните с примеров
- Спросите: «В качестве примеров приведены слова «доход» и «шалаш». А что насчет фраз вроде «А роза упала на лапу Азора?». Что насчет пустой строки или строки из одного символа?
- Это отвечает на вопрос: примет ли кандидат во внимание достаточное количество пограничных случаев? Насколько точным и внимательным он будет?
![](https://habrastorage.org/webt/sl/69/ye/sl69yeqpguiw8mpdvgsomq6_qcy.jpeg)
Прежде чем приступить к описанию кода, кратко ознакомьте интервьюера с алгоритмом
Как кандидат подходит к решению проблемы? Проговаривает ли он свои мысли вслух, чтобы интервьюер их услышал?
Например,
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 минут в день. Так информация переместится в долгосрочную память, и вы сможете вспомнить ее даже при экстремальном стрессе на собеседовании.
- Не подвергайте себя всем этим мучениям только ради того, чтобы пройти тест на доске. Цельтесь выше! Поставьте перед собой задачу стать более профессиональным программистом!