Здравствуйте, Паблик Морозов, Вы писали:
ПМ>З.Ы. На прошлой работе HR заставляла соискателей решать задачи про переливание воды, цветные шары и гномов в кепках. По-моему очень хорошая практика была, полные идиоты сразу отсеивались, сейчас контора гораздо более бюрократичная, тонко настроить фильтры HR-ов гораздо сложнее, приходится фильтровать самому.
все правильно, поддерживаю, задача хорошая. вообще задачки на логику, алгоритмы — обязательно нужно давать
почитала тред с интересом, а некоторые спецы которых я раньше уважала по разделу джава сразу как-то упали в моих глазах
Re[2]: Задача на собеседовании - обращение списка.
Здравствуйте, a.v.v, Вы писали:
AVV>а вы именно код просите написать? или и рассказ алгоритма пойдет?
Код. Заодно смотрю как человек его пишет. Если у человека есть какая-то разумная система именования идентификаторов (пусть даже не общепринятая), если он использует табуляцию — это сразу плюс. Если зовёт переменные node1, node2 — то сразу минус. Если спеллит непривильно — еще один минус. Причем хорошего программиста сразу видно — назвал ноды prev, current, next — уже на полпути к успеху, скорее всего правильно напишет. Назвал node1, node2 — сам запутался в присваиваниях и слился.
Re[9]: Задача на собеседовании - обращение списка.
Здравствуйте, msk78, Вы писали:
M>Здравствуйте, Vzhyk, Вы писали:
V>>24.02.2012 15:38, Паблик Морозов пишет:
>>> кандидатов на публичных сайтах вакансий не ищем. V>>В общем мы поняли, что не подходим друг другу. Чтобы сэкономить твое и V>>свое время было бы хорошо, чтобы ты озвучил контору, куда мне не следует V>>слать резюме. M>Могу дать ответ на этот вопрос M>Компания BrightConsult.
Там же CRM в основном. Причем тут разворот списков? Кто-то решил повыделываться?
Re[3]: Задача на собеседовании - обращение списка.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, a.v.v, Вы писали:
AVV>>а вы именно код просите написать? или и рассказ алгоритма пойдет?
ПМ>если он использует табуляцию — это сразу плюс.
а как на бумаге можно сделать табуляцию? или это на компе все?
ПМ>спеллит непривильно
это как?
Re[3]: Задача на собеседовании - обращение списка.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>если он использует табуляцию — это сразу плюс.
Let mortal flame begin!
ПМ>Если зовёт переменные node1, node2 — то сразу минус. Если спеллит непривильно — еще один минус. Причем хорошего программиста сразу видно — назвал ноды prev, current, next — уже на полпути к успеху, скорее всего правильно напишет. Назвал node1, node2 — сам запутался в присваиваниях и слился.
а вот это уже слишком тонкие моменты, чтобы на основании этого отказывать человеку
...coding for chaos...
Re[5]: Задача на собеседовании - обращение списка.
Здравствуйте, Vzhyk, Вы писали:
>> H>std::reverse(list.begin(), list.end()) >> Если в некой конторе будут ожидать такое решение, то лучше оттуда >> бежать, ибо требование знания наизусть функций стандартной библиотеки ни >> о чём хорошем не говорит. V>Это говорит о том, что чел не будет лишний раз придумывать велосипед с V>треугольными колесами, а будет писать понятный, правильно работающий V>код. А заниматься безумствами с оптимизацией будет только тогда, когда V>это очень нужно.
Ничего это не говорит. Думаю, любой программист с опытом работы больше пары лет умеет пользоваться гуглом и формумами, ищет решение перед тем, как решать с нуля самому. Даже если и попадаются неадекваты, это выявляется совсем другими вопросами.
В любом случае, задание, сформулированное таким способом, я бы тоже стал решать сам, а не вспоминать имя и параметры стандартной функции; хотя, наверное, упомянул бы между делом о ней, если бы вспомнил (ибо гугла на интервью обычно нет).
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Задача на собеседовании - обращение списка.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Здравствуйте, a.v.v, Вы писали:
AVV>>а вы именно код просите написать? или и рассказ алгоритма пойдет?
ПМ>Код. Заодно смотрю как человек его пишет. Если у человека есть какая-то разумная система именования идентификаторов (пусть даже не общепринятая), если он использует табуляцию — это сразу плюс. Если зовёт переменные node1, node2 — то сразу минус. Если спеллит непривильно — еще один минус. Причем хорошего программиста сразу видно — назвал ноды prev, current, next — уже на полпути к успеху, скорее всего правильно напишет. Назвал node1, node2 — сам запутался в присваиваниях и слился.
Как то пишут вот так и до сих пор не запутались:
// (c) list standard header from STLvoid sort()
{ // order sequence, using operator<if (2 <= _Mysize)
{ // worth sorting, do itconst size_t _MAXBINS = 25;
_Myt _Templist(this->_Alval), _Binlist[_MAXBINS + 1];
size_t _Maxbin = 0;
while (!empty())
{ // sort another element, using bins
_Templist._Splice(_Templist.begin(), *this, begin(),
++begin(), 1, true); // don't invalidate iterators
size_t _Bin;
for (_Bin = 0; _Bin < _Maxbin && !_Binlist[_Bin].empty();
++_Bin)
{ // merge into ever larger bins
_Binlist[_Bin].merge(_Templist);
_Binlist[_Bin].swap(_Templist);
}
if (_Bin == _MAXBINS)
_Binlist[_Bin - 1].merge(_Templist);
else
{ // spill to new bin, while they last
_Binlist[_Bin].swap(_Templist);
if (_Bin == _Maxbin)
++_Maxbin;
}
}
for (size_t _Bin = 1; _Bin < _Maxbin; ++_Bin)
_Binlist[_Bin].merge(_Binlist[_Bin - 1]); // merge up
splice(begin(), _Binlist[_Maxbin - 1]); // result in last bin
}
}
void _Orphan_ptr(_Myt& _Cont, _Nodeptr _Ptr) const
{ // orphan iterators with specified node pointers
_Lockit _Lock(_LOCK_DEBUG);
const_iterator **_Pnext = (const_iterator **)&_Cont._Myfirstiter;
while (*_Pnext != 0)
if ((*_Pnext)->_Ptr == _Myhead
|| _Ptr != 0 && (*_Pnext)->_Ptr != _Ptr)
_Pnext = (const_iterator **)&(*_Pnext)->_Mynextiter;
else
{ // orphan the iterator
(*_Pnext)->_Mycont = 0;
*_Pnext = (const_iterator *)(*_Pnext)->_Mynextiter;
}
}
Re[11]: Задача на собеседовании - обращение списка.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Я ничего не писал про навыки абстрагирования, я написал именно про ООП. Тип данных — это абстракция. Если человек не знает, что такое список, а слово это у него ассоциируется только с классом list — это как раз показатель, что абстрагировать человек не умеет.
Конкретно для Java, список — это то, что имплементит List. То есть структура данных, для которой возможен упорядоченный доступ по индексу. Это практически наиболее часто используемый интерфейс. В той же википедии вроде ничего не говорится о том, что под списком подразумевается именно связанный список.
В информатике, спи́сок (англ. list) — это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза.
List, кстати — это не класс, а интерфейс . А вот в .Net под List, ЕМНИП как раз подразумевается связанный список. Да и в других языках тоже под списком подразумевают именно связанный список, а учитывая, что я в последнее время Lispом усиленно проникаюсь, то у меня в последнее время под списком по умолчанию вообще односвязанный понимается.
Так вот, подход, применимый в Java — вполне корректен и вполне хорошо ложится на определение списка — разве нет? Так что плохого в том, что разработчик при работе со списками привык именно работать именно с интерфейсом List? Дополнительно, на практике обращение списка будет выглядить так — Collections.reverse(list). Без всяких циклов. А где именно этот reverse находится в стандартной библиотеке, это на собеседовании не помнимс чаще всего. Хотя ладно, признаю, уделали меня, можно и через интерфейс за линейное время сделать, забыл про метод previous у итератора, никогда им не пользовался . Сейчас посмотрел — все, на полгода я мегакрутой разработчик, ибо это некоторое время буду помнить . Хотя для односвязного списка, которого в библиотеке вроде как нет, обобщенный для всех списков алгоритм не будет линейным, ибо эффективно написать итератор, бегающий назад, проблематично. Так что формально я не так уж и был неправ с квадратичными глупостями .
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Почему 9 из 10 соискателей не могут её решить? Причём у людей минимум от 3-х лет опыта разработки, позиционируют они себя, как сеньёр-девелоперы, ЗП вроде конкурентноспособная (немного выше, если отсортировать вакансии с HH по зарплате и пропустить жöлтенькие).
ПМ>Может быть я что-то не понимаю в этой жизни? Не могли бы более опытные товарищи поделиться опытом и ответить на следующие вопросы: ПМ>1. Если человек не в состоянии обратить список, способен ли он вообще написать что-нибудь разумное или сразу нафиг?
Ну я бы, наверное, тоже не написал бы сходу программу для обращения списка — последний раз работал с указателями 11 лет назад. Кстати, тогда я участвовал в проекте по разработке встроенной системы реального времени на C. Однажды я у удивлением узнал, что ведущий программист нашего проекта со многими годами опыта на C совершенно не знал функций стандартной библиотеки C для чтения/записи из/в файл. Это дало мне повод усомниться в его компетенции. Но потом я понял, что никакой проблемы в этом нет. Мы работали в среде операционной системы pSOS, и у нас даже не было файловой системы. А все, что касалось нашего проекта, этот программист знал хорошо.
Кстати, полгода назад я проходил собеседование в одной компании на позицию Senior Developer, в которой мне перед собеседованием дали несколько заданий, в том числе написать на бумажке функцию реверсирования строки. Потом, после интервью, я вспомнил, что написал ее с ошибкой. Что неудивительно, поскольку последний раз писал код на бумажке лет 15 назад. Так что, меня из-за этого на работу брать нельзя ?
Re[4]: Задача на собеседовании - обращение списка.
H>>Я бы задумался. Человек 10 лет программирует, а все не научился стандарные библиотеки использовать .>Если бы я получил такое задание, я бы понял, что надо продемонстрировать алгоритмические способности, умение объяснить придуманный алгоритм собеседнику и быстро выразить в виде кода. Во многих серьёзных конторах подобные задачки и дают. Правда обычно пытаются выбрать задание, для решения которого нет стандартной функции в библиотеке. Хотя вот в Amazon мне задавали найти подстроку в строке, очевидно, что std::string.find их не интересовал.
Первое что мне сказали когда я пришел в IBM — Do not think, do ask.
Я бы сразу задал вопрос — устраивает ли решение из STL. Умные задают дополнительные вопросы — дураки сразу "понимают".
Знаменитая история. Джоел спольски любил задавать вопрос — нарисуйте дом. Вы рисуете квадратик с шапочкой, может даже окошком и дверцей. И когда закончили, Спольски говорил — да, совсем забыл. Домик-то для двуголовых жирафов. Что, размеры не те? чего не уточняли? все, до свиданья.
H>>std::reverse(list.begin(), list.end()) .>Если в некой конторе будут ожидать такое решение, то лучше оттуда бежать, ибо требование знания наизусть функций стандартной библиотеки ни о чём хорошем не говорит.
Это лучшее решение. В конторе где прогеры пишут реверс листа сами — очень многое говорит о неумении эффективно работать
Re[5]: Задача на собеседовании - обращение списка.
Здравствуйте, Handie, Вы писали:
H>>>std::reverse(list.begin(), list.end()) .>>Если в некой конторе будут ожидать такое решение, то лучше оттуда бежать, ибо требование знания наизусть функций стандартной библиотеки ни о чём хорошем не говорит.
H>Это лучшее решение. В конторе где прогеры пишут реверс листа сами — очень многое говорит о неумении эффективно работать
никто нигде не пишет реверс лист сам.
это просто задача на интервью чтоб выявить тех кто не знает что такое список, как такое быстро и красиво закодить, и т.д.
Re[10]: Задача на собеседовании - обращение списка.
Здравствуйте, gandjustas, Вы писали:
G>Да, но ты почему-то уверен что это знание выводится из умения разворачивать список на месте. G>Хотя это неверно.
Я вообще не понимаю о каких знаниях ты сейчас говоришь, если честно.
G>Это будет O(длина массива), а не O(кол-во элементов)
Ну да. Еще можно случайно выбирать элемент в диапазоне 0 — l ( := length — 1), обменивать его с крайним элементом массива l = l — 1, повторить. Тогда будет от O от кол-ва элементов, но исходный массив испортится. Вообще, для решения этой задачи надо задать больше уточняющих вопросов (например, что значит "случайных", какие требования к распределению и т.п.)
G>Ну вот. Ты проверку не прошел. Код очень простой, даже проще чем разворот списков.
G>[сcode] G>i=0; G>k = arr.length(); G>assert(n <= k);
G>while(n>0) G>{ G> if(rand(k) < n) G> { G> result.push_back(arr[i]); G> n--; G> } G> i++; G> k--; G>} G>[/сcode]
Ну и в каком месте он O(кол-ва элементов)??
G>Только ты его не знаешь и склонен преувеличивать сложность задачи.
Здравствуйте, зиг, Вы писали:
зиг>никто нигде не пишет реверс лист сам. зиг>это просто задача на интервью чтоб выявить тех кто не знает что такое список, как такое быстро и красиво закодить, и т.д.
безапелляционность утверждений не есть признак ума
Re[4]: Задача на собеседовании - обращение списка.
Здравствуйте, UA, Вы писали:
UA>Как то пишут вот так и до сих пор не запутались:
C++ — это вообще одна большая помойка, не на что там равняться. Единственное, за что уважаю плюсовиков, то что среди них действительно чуть меньше полных идиотов — помойка ошибок не прощает, чуть что — сразу граблями по лбу.
Re[5]: Задача на собеседовании - обращение списка.
Здравствуйте, Flying Dutchman, Вы писали:
FD>Однажды я у удивлением узнал, что ведущий программист нашего проекта со многими годами опыта на C совершенно не знал функций стандартной библиотеки C для чтения/записи из/в файл. Это дало мне повод усомниться в его компетенции. Но потом я понял, что никакой проблемы в этом нет. Мы работали в среде операционной системы pSOS, и у нас даже не было файловой системы. А все, что касалось нашего проекта, этот программист знал хорошо.
Поэтому проверка справочных знаний ни о чём не говорит. Возьмёт этот ваш ведущий программист справочник и прочитает, какие функции используются для чтения/записи. Важно только то, как человек пишет код, проектирует систему (если это архитектор) и т.д. Справочные знания могут устрать еще до того, как они выдет к вам на работу.
Re[11]: Задача на собеседовании - обращение списка.
Здравствуйте, Паблик Морозов, Вы писали:
ПМ>Ну да. Еще можно случайно выбирать элемент в диапазоне 0 — l ( := length — 1), обменивать его с крайним элементом массива l = l — 1, повторить. Тогда будет от O от кол-ва элементов, но исходный массив испортится. Вообще, для решения этой задачи надо задать больше уточняющих вопросов (например, что значит "случайных", какие требования к распределению и т.п.)
Шеф, признавай, что облажался даже покруче меня с квадратичной сложностью . Я конечно понимаю, что ты задание не понял, но пример показателен. И ведь задание вполне однозначное, никаких требований к распределению не подразумевает. Был массив 1,2,3. Нужно получить из него 10 случайных элементов — пожалуйста, 1 из вариантов — 1,3,2,2,2,2,1,3,1,1. И в чем сложность ?