Собеседование. Вопросы для программистов.
Все программисты делятся на три категории: те кто уже проходил собеседование, те, кто уже проводил собеседование и тем кому это предстоит: проходить или проводить. Сегодня на developers.org.ua – Нехитрый вопрос на собеседовании или как не попадают в стартапы. После прочтения осталось чёткое впечатление, что попадать в стартапы я не хочу. :)
Типичный вопрос для интервью – реверсирование строки. Вообще вопросы на собеседовании большей частью беспощадные (у Вас нет шансов, поскольку на большинство вопросов можно дать несколько ответов – но правильный считается тот который загадал ведущий) и бессмысленные. Бессмысленные в значении – что Вам никогда (никогда не говори никогда, но… почему-то именно так и происходит) не придется столкнуться с таким вопросом на практике.
Вам часто надо реверсировать строки? У меня только две идеи: проверка палиндромов и построение обратного словаря (словарь, в котором заглавные слова располагаются с учётом алфавита не от начала слова к концу, а от конца слова к началу. Лингвистам нужно для изучения языка.)
Но вот вопрос про реверсирование задают. Для php, для csharp (там нет “волшебной” функции), для c++, и подставьте свой любимый язык.
Люди попавшие в категорию 5 – практики – они искренне не могут понять – зачем. Категория 4 – знатоки – они “подозревают” что волшебная функция есть. Категория 3 – уже проходили собеседование и “подготовились”. Категория 2 – устали проходить интервью. Категория 1 – спортсмены, только что вернулись с Олимпиады.
Но я зануда, и решил проверить три варианта.
<?php
function reverse1($a)
{
$b = '';
for ($i = strlen($a)-1; $i>=0; $i--)
$b .= $a[$i];
return $b;
}
function reverse2($a)
{
$b = '';
$l = strlen($a)-1;
for ($i = 0; $i < $l/2; $i++)
{
$b = $a[$i];
$a[$i] = $a[$l-$i];
$a[$l-$i] = $b;
}
return $a;
}
$source = 'abcdefgh';
$time_start = microtime(true);
for ($t = 0; $t < 100000; $t++)
{
$reversed = strrev($source);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "1: $reversed time: $time \n";
$time_start = microtime(true);
for ($t = 0; $t < 100000; $t++)
{
$reversed = reverse1($source);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "2: $reversed time: $time \n";
$time_start = microtime(true);
for ($t = 0; $t < 100000; $t++)
{
$reversed = reverse2($source);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "3: $reversed time: $time \n";
?>
Результат:
1: hgfedcba time: 0.0745480060577
2: hgfedcba time: 0.8450050354
3: hgfedcba time: 1.23111915588
3-й вариант удивил? Не так ли? Добро пожаловать в реальность. 2-й вариант кстати тоже не плох.
P.S. На собеседовании брать/не брать решают в первые 30 секунд, пока Вы заходите и еще не произнесли ни слова.
