Собеседование. Вопросы для программистов.

Все программисты делятся на три категории: те кто уже проходил собеседование, те, кто уже проводил собеседование и тем кому это предстоит: проходить или проводить. Сегодня на 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 секунд, пока Вы заходите и еще не произнесли ни слова.

Опубликовано Июнь 12, 2008 в 6:12 пп · Автор Михаил · Ссылка
Рубрики: Программирование, Разное