Re: Задача на собеседовании - обращение списка.
От: зиг Украина  
Дата: 24.02.12 14:55
Оценка: :)
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>З.Ы. На прошлой работе HR заставляла соискателей решать задачи про переливание воды, цветные шары и гномов в кепках. По-моему очень хорошая практика была, полные идиоты сразу отсеивались, сейчас контора гораздо более бюрократичная, тонко настроить фильтры HR-ов гораздо сложнее, приходится фильтровать самому.


все правильно, поддерживаю, задача хорошая. вообще задачки на логику, алгоритмы — обязательно нужно давать
почитала тред с интересом, а некоторые спецы которых я раньше уважала по разделу джава сразу как-то упали в моих глазах
Re[2]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 24.02.12 14:56
Оценка: 1 (1)
Здравствуйте, a.v.v, Вы писали:

AVV>а вы именно код просите написать? или и рассказ алгоритма пойдет?


Код. Заодно смотрю как человек его пишет. Если у человека есть какая-то разумная система именования идентификаторов (пусть даже не общепринятая), если он использует табуляцию — это сразу плюс. Если зовёт переменные node1, node2 — то сразу минус. Если спеллит непривильно — еще один минус. Причем хорошего программиста сразу видно — назвал ноды prev, current, next — уже на полпути к успеху, скорее всего правильно напишет. Назвал node1, node2 — сам запутался в присваиваниях и слился.
Re[9]: Задача на собеседовании - обращение списка.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.02.12 14:56
Оценка:
Здравствуйте, msk78, Вы писали:

M>Здравствуйте, Vzhyk, Вы писали:


V>>24.02.2012 15:38, Паблик Морозов пишет:


>>> кандидатов на публичных сайтах вакансий не ищем.

V>>В общем мы поняли, что не подходим друг другу. Чтобы сэкономить твое и
V>>свое время было бы хорошо, чтобы ты озвучил контору, куда мне не следует
V>>слать резюме.
M>Могу дать ответ на этот вопрос
M>Компания BrightConsult.

Там же CRM в основном. Причем тут разворот списков? Кто-то решил повыделываться?
Re[3]: Задача на собеседовании - обращение списка.
От: a.v.v Россия  
Дата: 24.02.12 14:58
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Здравствуйте, a.v.v, Вы писали:


AVV>>а вы именно код просите написать? или и рассказ алгоритма пойдет?


ПМ>если он использует табуляцию — это сразу плюс.


а как на бумаге можно сделать табуляцию? или это на компе все?

ПМ>спеллит непривильно


это как?
Re[3]: Задача на собеседовании - обращение списка.
От: neFormal Россия  
Дата: 24.02.12 15:10
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>если он использует табуляцию — это сразу плюс.


Let mortal flame begin!

ПМ>Если зовёт переменные node1, node2 — то сразу минус. Если спеллит непривильно — еще один минус. Причем хорошего программиста сразу видно — назвал ноды prev, current, next — уже на полпути к успеху, скорее всего правильно напишет. Назвал node1, node2 — сам запутался в присваиваниях и слился.


а вот это уже слишком тонкие моменты, чтобы на основании этого отказывать человеку
...coding for chaos...
Re[5]: Задача на собеседовании - обращение списка.
От: . Великобритания  
Дата: 24.02.12 15:15
Оценка:
Здравствуйте, Vzhyk, Вы писали:

>> H>std::reverse(list.begin(), list.end())

>> Если в некой конторе будут ожидать такое решение, то лучше оттуда
>> бежать, ибо требование знания наизусть функций стандартной библиотеки ни
>> о чём хорошем не говорит.
V>Это говорит о том, что чел не будет лишний раз придумывать велосипед с
V>треугольными колесами, а будет писать понятный, правильно работающий
V>код. А заниматься безумствами с оптимизацией будет только тогда, когда
V>это очень нужно.
Ничего это не говорит. Думаю, любой программист с опытом работы больше пары лет умеет пользоваться гуглом и формумами, ищет решение перед тем, как решать с нуля самому. Даже если и попадаются неадекваты, это выявляется совсем другими вопросами.
В любом случае, задание, сформулированное таким способом, я бы тоже стал решать сам, а не вспоминать имя и параметры стандартной функции; хотя, наверное, упомянул бы между делом о ней, если бы вспомнил (ибо гугла на интервью обычно нет).
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Задача на собеседовании - обращение списка.
От: UA Украина  
Дата: 24.02.12 15:29
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Здравствуйте, a.v.v, Вы писали:


AVV>>а вы именно код просите написать? или и рассказ алгоритма пойдет?


ПМ>Код. Заодно смотрю как человек его пишет. Если у человека есть какая-то разумная система именования идентификаторов (пусть даже не общепринятая), если он использует табуляцию — это сразу плюс. Если зовёт переменные node1, node2 — то сразу минус. Если спеллит непривильно — еще один минус. Причем хорошего программиста сразу видно — назвал ноды prev, current, next — уже на полпути к успеху, скорее всего правильно напишет. Назвал node1, node2 — сам запутался в присваиваниях и слился.


Как то пишут вот так и до сих пор не запутались:
// (c) list standard header from STL

    void sort()
        {    // order sequence, using operator<
        if (2 <= _Mysize)
            {    // worth sorting, do it
            const 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]: Задача на собеседовании - обращение списка.
От: elmal  
Дата: 24.02.12 15:40
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Я ничего не писал про навыки абстрагирования, я написал именно про ООП. Тип данных — это абстракция. Если человек не знает, что такое список, а слово это у него ассоциируется только с классом list — это как раз показатель, что абстрагировать человек не умеет.

Конкретно для Java, список — это то, что имплементит List. То есть структура данных, для которой возможен упорядоченный доступ по индексу. Это практически наиболее часто используемый интерфейс. В той же википедии вроде ничего не говорится о том, что под списком подразумевается именно связанный список.

В информатике, спи́сок (англ. list) — это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза.

List, кстати — это не класс, а интерфейс . А вот в .Net под List, ЕМНИП как раз подразумевается связанный список. Да и в других языках тоже под списком подразумевают именно связанный список, а учитывая, что я в последнее время Lispом усиленно проникаюсь, то у меня в последнее время под списком по умолчанию вообще односвязанный понимается.
Так вот, подход, применимый в Java — вполне корректен и вполне хорошо ложится на определение списка — разве нет? Так что плохого в том, что разработчик при работе со списками привык именно работать именно с интерфейсом List? Дополнительно, на практике обращение списка будет выглядить так — Collections.reverse(list). Без всяких циклов. А где именно этот reverse находится в стандартной библиотеке, это на собеседовании не помнимс чаще всего. Хотя ладно, признаю, уделали меня, можно и через интерфейс за линейное время сделать, забыл про метод previous у итератора, никогда им не пользовался . Сейчас посмотрел — все, на полгода я мегакрутой разработчик, ибо это некоторое время буду помнить . Хотя для односвязного списка, которого в библиотеке вроде как нет, обобщенный для всех списков алгоритм не будет линейным, ибо эффективно написать итератор, бегающий назад, проблематично. Так что формально я не так уж и был неправ с квадратичными глупостями .
Re: Задача на собеседовании - обращение списка.
От: Flying Dutchman Украина  
Дата: 24.02.12 15:48
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Почему 9 из 10 соискателей не могут её решить? Причём у людей минимум от 3-х лет опыта разработки, позиционируют они себя, как сеньёр-девелоперы, ЗП вроде конкурентноспособная (немного выше, если отсортировать вакансии с HH по зарплате и пропустить жöлтенькие).


ПМ>Может быть я что-то не понимаю в этой жизни? Не могли бы более опытные товарищи поделиться опытом и ответить на следующие вопросы:

ПМ>1. Если человек не в состоянии обратить список, способен ли он вообще написать что-нибудь разумное или сразу нафиг?

Ну я бы, наверное, тоже не написал бы сходу программу для обращения списка — последний раз работал с указателями 11 лет назад. Кстати, тогда я участвовал в проекте по разработке встроенной системы реального времени на C. Однажды я у удивлением узнал, что ведущий программист нашего проекта со многими годами опыта на C совершенно не знал функций стандартной библиотеки C для чтения/записи из/в файл. Это дало мне повод усомниться в его компетенции. Но потом я понял, что никакой проблемы в этом нет. Мы работали в среде операционной системы pSOS, и у нас даже не было файловой системы. А все, что касалось нашего проекта, этот программист знал хорошо.

Кстати, полгода назад я проходил собеседование в одной компании на позицию Senior Developer, в которой мне перед собеседованием дали несколько заданий, в том числе написать на бумажке функцию реверсирования строки. Потом, после интервью, я вспомнил, что написал ее с ошибкой. Что неудивительно, поскольку последний раз писал код на бумажке лет 15 назад. Так что, меня из-за этого на работу брать нельзя ?
Re[4]: Задача на собеседовании - обращение списка.
От: Handie  
Дата: 24.02.12 15:55
Оценка: 1 (1) -2
H>>Я бы задумался. Человек 10 лет программирует, а все не научился стандарные библиотеки использовать
.>Если бы я получил такое задание, я бы понял, что надо продемонстрировать алгоритмические способности, умение объяснить придуманный алгоритм собеседнику и быстро выразить в виде кода. Во многих серьёзных конторах подобные задачки и дают. Правда обычно пытаются выбрать задание, для решения которого нет стандартной функции в библиотеке. Хотя вот в Amazon мне задавали найти подстроку в строке, очевидно, что std::string.find их не интересовал.

Первое что мне сказали когда я пришел в IBM — Do not think, do ask.
Я бы сразу задал вопрос — устраивает ли решение из STL. Умные задают дополнительные вопросы — дураки сразу "понимают".

Знаменитая история. Джоел спольски любил задавать вопрос — нарисуйте дом. Вы рисуете квадратик с шапочкой, может даже окошком и дверцей. И когда закончили, Спольски говорил — да, совсем забыл. Домик-то для двуголовых жирафов. Что, размеры не те? чего не уточняли? все, до свиданья.

H>>std::reverse(list.begin(), list.end())

.>Если в некой конторе будут ожидать такое решение, то лучше оттуда бежать, ибо требование знания наизусть функций стандартной библиотеки ни о чём хорошем не говорит.

Это лучшее решение. В конторе где прогеры пишут реверс листа сами — очень многое говорит о неумении эффективно работать
Re[5]: Задача на собеседовании - обращение списка.
От: зиг Украина  
Дата: 24.02.12 16:14
Оценка:
Здравствуйте, Handie, Вы писали:

H>>>std::reverse(list.begin(), list.end())

.>>Если в некой конторе будут ожидать такое решение, то лучше оттуда бежать, ибо требование знания наизусть функций стандартной библиотеки ни о чём хорошем не говорит.

H>Это лучшее решение. В конторе где прогеры пишут реверс листа сами — очень многое говорит о неумении эффективно работать

никто нигде не пишет реверс лист сам.
это просто задача на интервью чтоб выявить тех кто не знает что такое список, как такое быстро и красиво закодить, и т.д.
Re[10]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 24.02.12 16:21
Оценка:
Здравствуйте, 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>Только ты его не знаешь и склонен преувеличивать сложность задачи.


Опять телепатия. Где я что преувеличивал? Я написал, что не знаю, что это за задача, и что у LCS сложность больше O(n). (http://en.wikipedia.org/wiki/Longest_common_subsequence_problem)
Re[6]: Задача на собеседовании - обращение списка.
От: a.v.v Россия  
Дата: 24.02.12 16:28
Оценка: +1
Здравствуйте, зиг, Вы писали:

зиг>никто нигде не пишет реверс лист сам.

зиг>это просто задача на интервью чтоб выявить тех кто не знает что такое список, как такое быстро и красиво закодить, и т.д.

безапелляционность утверждений не есть признак ума
Re[4]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 24.02.12 16:28
Оценка:
Здравствуйте, a.v.v, Вы писали:

AVV>а как на бумаге можно сделать табуляцию? или это на компе все?


На компе.

ПМ>>спеллит непривильно


SingleTon
Re[4]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 24.02.12 16:32
Оценка:
Здравствуйте, neFormal, Вы писали:

F>а вот это уже слишком тонкие моменты, чтобы на основании этого отказывать человеку


Это не повод для отказа, это просто наблюдение.
Re[4]: Задача на собеседовании - обращение списка.
От: Banned by IT  
Дата: 24.02.12 16:35
Оценка: -3 :)
Здравствуйте, UA, Вы писали:

UA>Как то пишут вот так и до сих пор не запутались:

У STL один из самых хреновых стилей которые я когда либо видел.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[4]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 24.02.12 16:35
Оценка: :))
Здравствуйте, UA, Вы писали:

UA>Как то пишут вот так и до сих пор не запутались:


C++ — это вообще одна большая помойка, не на что там равняться. Единственное, за что уважаю плюсовиков, то что среди них действительно чуть меньше полных идиотов — помойка ошибок не прощает, чуть что — сразу граблями по лбу.
Re[5]: Задача на собеседовании - обращение списка.
От: a.v.v Россия  
Дата: 24.02.12 16:38
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>>>спеллит непривильно


ПМ>SingleTon


понял, вот это конечно более тревожный знак чем невозможность написать код
Re[2]: Задача на собеседовании - обращение списка.
От: Паблик Морозов  
Дата: 24.02.12 16:39
Оценка:
Здравствуйте, Flying Dutchman, Вы писали:

FD>Однажды я у удивлением узнал, что ведущий программист нашего проекта со многими годами опыта на C совершенно не знал функций стандартной библиотеки C для чтения/записи из/в файл. Это дало мне повод усомниться в его компетенции. Но потом я понял, что никакой проблемы в этом нет. Мы работали в среде операционной системы pSOS, и у нас даже не было файловой системы. А все, что касалось нашего проекта, этот программист знал хорошо.


Поэтому проверка справочных знаний ни о чём не говорит. Возьмёт этот ваш ведущий программист справочник и прочитает, какие функции используются для чтения/записи. Важно только то, как человек пишет код, проектирует систему (если это архитектор) и т.д. Справочные знания могут устрать еще до того, как они выдет к вам на работу.
Re[11]: Задача на собеседовании - обращение списка.
От: elmal  
Дата: 24.02.12 16:47
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Ну да. Еще можно случайно выбирать элемент в диапазоне 0 — l ( := length — 1), обменивать его с крайним элементом массива l = l — 1, повторить. Тогда будет от O от кол-ва элементов, но исходный массив испортится. Вообще, для решения этой задачи надо задать больше уточняющих вопросов (например, что значит "случайных", какие требования к распределению и т.п.)

Шеф, признавай, что облажался даже покруче меня с квадратичной сложностью . Я конечно понимаю, что ты задание не понял, но пример показателен. И ведь задание вполне однозначное, никаких требований к распределению не подразумевает. Был массив 1,2,3. Нужно получить из него 10 случайных элементов — пожалуйста, 1 из вариантов — 1,3,2,2,2,2,1,3,1,1. И в чем сложность ?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.