Я был сразу прерван фразой «stl использовать нельзя». Вообще, я бы не советовал использовать С++ на собеседовании, а то столько разных ньюансов вокруг этого появляется. Питон будет лучшим вариантом.
Гугл известен тем, что платит наибольшие деньги и я буду очень рад, если многие, читающие этот форум, смогут туда устроиться, тем более, что это заграницей. И я надеюсь наш разговор будет полезен всем тем, кто еще не проходил собеседования, для того, чтобы примерно оценить ожидания собеседующего и примерное настроение при разговоре.
Приходит такой человек собеседоваться. Вы ему «подметите плац» и показываете набор инструментов. Он хватает лом, быстро подметает, вы одобрительно киваете. Молодец, далеко пойдет.
Извините, но это бред. По вашей логике atoi в Python тоже с сишными строками работает? Или в Go? Как насчёт rustа? Весь мир шагает не в ногу, один вы, такой красивый — в ногу?
То есть во всех этих языках реально конвертится в null-terminated строку или все-таки в нативный формат? Спрашиватель сей задачи ожидает ответ для null-terminated Сишной строки или нет?
Нет никакого «правильного» ответа. Есть код. Который вы должны написать.
Обычно люди с таким менталитетом идут в армию. Там им удобно и понятно. Им сказано подметать плац ломом, значит, надо подметать плац ломом.
«a» в itoa означает ANSI string — null terminated 1 bytes per char. Это Сишный формат строк. У С++ свой формат строк. Постановка задачи некорректная. Корректная — написать string to_string(int)
Касаемо «ожидания готового кода», мне его скопипастить, чтоли, из приведенной выше ссылки? Я написал, что именно это подразумевается под правильным ответом на вопрос «напишите itoa».
Касательно требования «нельзя использовать ф-ии string» — его мне высказал автор статьи
Реально я более, чем уверен, что std::to_string реализуется достаточно муторно, но можно это сделать на коленке примерно так:
string to_string(int x)
{
if (x < 0)
return string('-') + to_string(-x);
const int BASE = 10;
string s;
for(; x > 0; x/=BASE)
s += digit_of(x%BASE);
return reverse(s);
}
Если вкратце то:
— постановка задачи «написать itoa на С++» некорректна
— постановка задачи «написать int to std::string на C++» корректна
— постановка задачи «написать int to std::string на C++ без использования ф-ий std::string» некорректна
Если бы мне была очень нужна работа, я бы написал код, приведенный по ссылке сверху. Можете его покритиковать, будет интересно. Очень удивлюсь, если он неидеален по стандартам Гугла.
Но просить написать такой код это примерно как, нанимая электрика, дать ему два провода и сказать — «сделайте нам скрутку», ожидая, что сейчас от зачистит провода зубами, скрутит руками и сверху изоленточкой. Нормальный электрик вас просто пошлет с такими заданиями. Вежлиый начнет спрашивать, из каких металлов провода, на какой ток расчитаны, какой толщиной, почему нельзя их спаять, можно ли использовать термоусадочные материалы и прочее.
Интервьювер наверняка скажет, что электрик совсем ничего сделать не может, то, что даже ребенок умеет. Но понимаете, и электрик скорее всего вежливо просто обойдет такую контору стороной, если у него есть выбор работать там, где провода пальцами не скручивают.
Да нет, я прекрасно понимаю, что требуется написать код в духе www.geeksforgeeks.org/implement-itoa(и я могу его воспроизвести по памяти, так как писал его еще мелом на доске, когда Ельцин был президентом). И я знаю, что это именно то, что ожидается. Просто этот код мерзкий. Ни один здравый программист, размышляя с нуля не будет писать такой код. Просто есть такая древняя традиция, лет 30 которой уже, задавать вопрос по itoa (который некорректный сам по себе) и отвечать таким говнокодом, делая вид, что это С++
Джоел то, Джоел это. Я помню тоже удовольствием зачитывался им, когда еще не существовало скайпа и ютуба. Каждый джуниор с новой книжкой для себя столько великих идей открывает. До clean code, я так понимаю, еще не добрались?
Еще 18 или 19 лет назад я на олимпиаде по программированию занял 1ое место по городу. Я прекрасно в курсе кода, который принято писать для «C++ имплементации itoa». Но он мерзкий. Он из 90ых. С тех пор С++ изменился, а этот мерзкий пример — нет. Просить написать этот код в 2018ом году, это как просить журналиста написать тестовую статью на старославянском, при том, что писать он будет на современном русском.
Я думаю, если бы попал на собеседование к вам, мы бы прекрасно поговорили. Но мой пойнт в том, что куда более вероятно попадание к khim, которые, конечно же, считают, что вопросы важно и нужно задавать, но только те, которые ожидает интервьювер и на которые заранее знает ответы. И что сам формат собеседования по времени реально не предусматривает достаточно времени для вдумчивого обсуждения задачи. Ничего сильно плохого в этом нет. В том же универе на экзамене вы тоже знакомитесь с лекциями, а потом часто от вас требуется прямо на ходу выдавать ответ. Просто надо заранее обсуждать формат собеседования, что, мол, спрашивать будем вот по этим вот лекциям.
Кстати, многие американские представители Гугла и прочих компаний в открытую говорят — не выучите материал этих книжке — интервью не пройдете.
А еще мне не нравится, когда джуниор, собеседующий меня со своими двумя годами опыта, считает, что он лучше меня разбирается в разработке ПО, раз работает в Гугле, чем я со своими 15ю. Потом, вам лет через 10 с опытом придет, что людям очень редко надо на самом деле именно то, что они просят.
Первый раз в жизни встречаю человека, который на полном серьезе мне доказывает, что моя обязанность — работать, не задавая вопросов. Работаете в индустрии вывоза больших черных мешков или отмывания странных больших пятен?
Ну так и я про то же. Да, в реальной работе я всегда задаю подобные вопросы — зачем нам конкретно это надо, почему мы делаем именно так и чем вызваны любые нестандартные решения. Не нужно раздражжать интервьювера. Вместо этого нужно просто оттарабанить стандартное всем известное решение и еще несколько таких, получить свой оффер, сидеть в офисе у батареи и радоваться жизни, радостно поковыривая в носу.
Хорошо, но строка в С++ это std::string. Допустим, мы хотим преобразовать в string, но не используя ф-ий преобразования string. Тогда разумно использовать std::vector для хранения промежуточного результата, не так ли?
Для начала я бы уточнил язык. Это Си или C++? И если это С++ не лучше ли конвертить не в ANSI string, а в std::string, у которой уже есть c_str()? Ну и таких вопросов у меня еще много. Хотя, конечно, ничего удивительно нет в том, что они вызывают раздражжение у собеседующего, который просто хочет сравнить 5 написанных строк с тем, что у него в памяти. Но, разве, это какие-то плохие вопросы?
Я прекрасно понимаю, что любая хорошая компания пытается произвести приятное впечатление на собеседуемого, даже если ему отказывает. Пытается сделать ему наиболее прозрачную и понятную оценку, обьяснить, что она не основана на каком-нить там расизме и дать повод подумать, над чем поработать, чтобы прийти через год. Мой оригинальный коммент был вызван тем, что конкретно у Гугла это в моем случае не получилось вообще никак. При этом я в курсе как можно было бы избежать этих проблем — надо было просто заучить стандартные ответы на стандартные (а мне задали совершенно стандартные вопросы из cracking code interview) и я бы прошел совершенно прекрасно. Поэтому мой совет начинающим и не только программистам — не следуйте моим путем, просто тупо заучите, что от вас требуется и оттарабаньте на собесе, как это делают все остальные прошедшие.
Гугл известен тем, что платит наибольшие деньги и я буду очень рад, если многие, читающие этот форум, смогут туда устроиться, тем более, что это заграницей. И я надеюсь наш разговор будет полезен всем тем, кто еще не проходил собеседования, для того, чтобы примерно оценить ожидания собеседующего и примерное настроение при разговоре.
То есть во всех этих языках реально конвертится в null-terminated строку или все-таки в нативный формат? Спрашиватель сей задачи ожидает ответ для null-terminated Сишной строки или нет?
Обычно люди с таким менталитетом идут в армию. Там им удобно и понятно. Им сказано подметать плац ломом, значит, надо подметать плац ломом.
Касаемо «ожидания готового кода», мне его скопипастить, чтоли, из приведенной выше ссылки? Я написал, что именно это подразумевается под правильным ответом на вопрос «напишите itoa».
Касательно требования «нельзя использовать ф-ии string» — его мне высказал автор статьи
Реально я более, чем уверен, что std::to_string реализуется достаточно муторно, но можно это сделать на коленке примерно так:
— постановка задачи «написать itoa на С++» некорректна
— постановка задачи «написать int to std::string на C++» корректна
— постановка задачи «написать int to std::string на C++ без использования ф-ий std::string» некорректна
Но просить написать такой код это примерно как, нанимая электрика, дать ему два провода и сказать — «сделайте нам скрутку», ожидая, что сейчас от зачистит провода зубами, скрутит руками и сверху изоленточкой. Нормальный электрик вас просто пошлет с такими заданиями. Вежлиый начнет спрашивать, из каких металлов провода, на какой ток расчитаны, какой толщиной, почему нельзя их спаять, можно ли использовать термоусадочные материалы и прочее.
Интервьювер наверняка скажет, что электрик совсем ничего сделать не может, то, что даже ребенок умеет. Но понимаете, и электрик скорее всего вежливо просто обойдет такую контору стороной, если у него есть выбор работать там, где провода пальцами не скручивают.
www.geeksforgeeks.org/implement-itoa(и я могу его воспроизвести по памяти, так как писал его еще мелом на доске, когда Ельцин был президентом). И я знаю, что это именно то, что ожидается. Просто этот код мерзкий. Ни один здравый программист, размышляя с нуля не будет писать такой код. Просто есть такая древняя традиция, лет 30 которой уже, задавать вопрос по itoa (который некорректный сам по себе) и отвечать таким говнокодом, делая вид, что это С++
Кстати, многие американские представители Гугла и прочих компаний в открытую говорят — не выучите материал этих книжке — интервью не пройдете.