Помимо выслушивания зазубренных ответов на стандартные вопросы типа
"Что такое полиморфизм?",
"Что представляет собой STL?",
"Какое отличие между std::auto_ptr и boost::shared_ptr?",
всегда хочется понаблюдать за тем как кандидат мыслит и решает реальные задачи. Потому как очень мегачасто бывает так, что вроде и на все вопросы кандидат отвечает, и то знает, и об этом представление имеет, и то, и сё, и пятое, и десятое. И вроде всё классно, и ты доволен, и впечатление хорошее производит... Но как только дело доходит то решения какой-то несложной задачки, оказывается, что процесс мышления у человека ну как-то совсем не протекает. Ну ладно я пойму если его в процессе решения занесет куда-то не в ту степь, или в решении будут ошибки - отрицательный результат тоже результат. Но когда человек несколько минут медитирует на лист бумаги и не может даже начать решать задачу, зацепиться за что-нибудь, ну это уже совсем пичалька.
Вот чтобы выявлять таких вот нерадивых кандидатов, я решил помимо списка вопросов составить список задачек, которые буду предлагать на собеседованиях. Приглашаю всех поучаствовать в составлении.
"Что такое полиморфизм?",
"Что представляет собой STL?",
"Какое отличие между std::auto_ptr и boost::shared_ptr?",
всегда хочется понаблюдать за тем как кандидат мыслит и решает реальные задачи. Потому как очень мегачасто бывает так, что вроде и на все вопросы кандидат отвечает, и то знает, и об этом представление имеет, и то, и сё, и пятое, и десятое. И вроде всё классно, и ты доволен, и впечатление хорошее производит... Но как только дело доходит то решения какой-то несложной задачки, оказывается, что процесс мышления у человека ну как-то совсем не протекает. Ну ладно я пойму если его в процессе решения занесет куда-то не в ту степь, или в решении будут ошибки - отрицательный результат тоже результат. Но когда человек несколько минут медитирует на лист бумаги и не может даже начать решать задачу, зацепиться за что-нибудь, ну это уже совсем пичалька.
Вот чтобы выявлять таких вот нерадивых кандидатов, я решил помимо списка вопросов составить список задачек, которые буду предлагать на собеседованиях. Приглашаю всех поучаствовать в составлении.
- Заменить в битовом представлении числа самый правый ноль на единицу.
int ReplaceLastZeroWithOne( int i ) { return i | ( i + 1); }
- Вывести число как последовательность битов в прямом и обратном порядке.
// Решение в лоб void OutputBitsReverse( int i ) { while( i ) { if( i < 2 ) { cout << i; } else { short bit = i % 2; cout << bit; } i /= 2; } }
void OutputBitsReverse(unsigned val) { unsigned reverseMask = 1; printf("%u = ", val); for( unsigned i = 1; i <= 32; i++) { putchar(val & reverseMask ? '1' : '0'); val >>= 1 ; } }
void OutputBitsForward(unsigned val) { unsigned forwardMask = 1 << 31; printf("%u = ", val); for( unsigned i = 1; i <= 32; i++) { putchar(val & forwardMask ? '1' : '0'); val <<= 1 ; } }
- Реализовать функцию atoi() для целых неотрицательных чисел в десятичном формате.
// Решение в лоб, без дополнительных проверок на переполнение int atoi_( const char* src ) { if( !src ) { return 0; } int result = 0; int strlen = 0; const char* tmp = src; char ch; while( ch = *tmp++ ) { if( ( '0' > ch ) || ( '9' < ch ) ) { return 0; } ++strlen; } while( *src ) { int digit = *src++ - '0'; double base = 10; result += digit * pow( base, --strlen ); } return result; }