![Smile :)](./images/smilies/icon_smile.gif)
И зачем вы делаете do while? Это сильно уменьшает читабельность.
а, увидел, что отрицательные числа вы всё-таки тоже решили включить. Так получается:АццкоМото wrote:Он срабатывает на переполненииAlexander Troyansky wrote:я так понял achtung срабатывает на отрицательных числахАццкоМото wrote:Мамочки... зачем же столько букв-то???
так что ли трудно проверить на переполнение
if (j=10*i+c<i) return achtung; else i=j;
и знак менять уже за циклом, а не проверять на него на каждой итерации
так написать действительно очень-очень-очень сложно. потому что это чудовищно
ЗЫ. И вот это
if (!*str)
return false;
не несет вообще никакого смысла
Code: Select all
bool str2int(const char * str, int & res)
{
if (!str || !*str)
return false;
res = 0;
bool bNeg = *str == '-';
if (bNeg)
str++;
int res0;
do
{
char c = *str - '0';
if (c >= 0 && c <= 9)
{
if (bNeg) {
res0 = -res;
res = -10 * res0 - c;
if (res > res0)
return false;
} else {
res0 = res;
res = 10 * res0 + c;
if (res < res0)
return false;
}
}
else
return false;
}
while(*++str != '\0');
return true;
}
Не, низачот:Интеррапт wrote:Это да. Т.е. мы как бы дойдем до проверки '\0' - '0'. Не люблю я такое, хоть и вполне легальная конструкция.АццкоМото wrote:Это проверка на то, не кончилась ли строка сразу после минуса. но поскольку дальше идет цикл с проверкой, что символ под указателем - от '0' до '9', ее можно безболезненно выкинутьИнтеррапт wrote: Ну это как бы проверка на пустую строку. Так что в принципе смысл в этом есть. Я лично все-равно люблю более читаемые конструкции типа if(*str == '\0'), но это уже дело вкуса.
Вообщем, Александр, если вы эту задачу решили за 10 минут, давайте зачетку
может как раз ищутся фронтендщики разрабатывающие УИ, и там наверное очень важное качество предвидеть все ошибки и злые намерения пользователя и вычислить все граничные условия.xtigr wrote:ну и зачем требовать такую детализацию во время интервью? Мне лично достаточно, если кандидат напишет пару строк кода, чтоб был понятен алгоритм, и чтоб упомянул про все проверки, можно просто словами.
Что лично почерпнет интервьювер из такой детально решеной задачки кроме того что кандидат может написать атои?
ведь на все остальное времени не останется.
Во-во. Что собственно я тоже упомянул на предидущих страницах. Достаточно увидеть, что кандидат умеет писать элементарный код ну и переходим к более интересным задачам.xtigr wrote:ну и зачем требовать такую детализацию во время интервью? Мне лично достаточно, если кандидат напишет пару строк кода, чтоб был понятен алгоритм, и чтоб упомянул про все проверки, можно просто словами.
Что лично почерпнет интервьювер из такой детально решеной задачки кроме того что кандидат может написать атои?
ведь на все остальное времени не останется.
нет, не так, так еще хуже, хотя казалось бы, возможно ли этоAlexander Troyansky wrote:а, увидел, что отрицательные числа вы всё-таки тоже решили включить. Так получается:
Последний раз в MS так и спрашивали (при том, трое разных), а как бы вы реализовали, ну, хорошо, кодируйте, ну ладно, ясно... дальше. Но затормозив на конкретном алгоритме, допрашиваемый был подвергнут дополнительным вопросам.xtigr wrote:ну и зачем требовать такую детализацию во время интервью? Мне лично достаточно, если кандидат напишет пару строк кода, чтоб был понятен алгоритм, и чтоб упомянул про все проверки, можно просто словами.
Что лично почерпнет интервьювер из такой детально решеной задачки кроме того что кандидат может написать атои?
ведь на все остальное времени не останется.
ну вот я о чем и говорил: "Ужасно! Чудовищно! Так нельзя!". Ну я не умею угадывать мысли, поэтому взял на себя труд попытаться угадать, что конкретно вы имели в виду. Ну не хотите, как хотите. Это вроде лишь дело 5 минут, но мы тут с вами бодаемся уже который час.АццкоМото wrote:нет, не так, так еще хуже, хотя казалось бы, возможно ли этоAlexander Troyansky wrote:а, увидел, что отрицательные числа вы всё-таки тоже решили включить. Так получается:
это была позиция тестера. Последнее интервью. Как-то получилось, что все собеседники уделяли минут 10-20 на общие вопросы: чего и как делал; почему Гугл... Остальное время на задачи всякие разные; по всей видимости, собеседующий хотел знать, как бы я работал в условиях недостатка данных/спецификаций типа "задавай вопросы". Простым упомянанием проверок я не отделался -- потребовалось кодирование на доске. Погорел классическим образом: упустил проверку граничных условий. Помню, что собеседователь очень распереживался.xtigr wrote:ну и зачем требовать такую детализацию во время интервью? Мне лично достаточно, если кандидат напишет пару строк кода, чтоб был понятен алгоритм, и чтоб упомянул про все проверки, можно просто словами.
Что лично почерпнет интервьювер из такой детально решеной задачки кроме того что кандидат может написать атои?
ведь на все остальное времени не останется.
В этом случае еще куда ни шло, т.е. все остальное проверено, теперь проверяется внимание к деталям.Alexander Troyansky wrote:это была позиция тестера. Последнее интервью. Как-то получилось, что все собеседники уделяли минут 10-20 на общие вопросы: чего и как делал; почему Гугл... Остальное время на задачи всякие разные; по всей видимости, собеседующий хотел знать, как бы я работал в условиях недостатка данных/спецификаций типа "задавай вопросы". Простым упомянанием проверок я не отделался -- потребовалось кодирование на доске. Погорел классическим образом: упустил проверку граничных условий. Помню, что собеседователь очень распереживался.xtigr wrote:ну и зачем требовать такую детализацию во время интервью? Мне лично достаточно, если кандидат напишет пару строк кода, чтоб был понятен алгоритм, и чтоб упомянул про все проверки, можно просто словами.
Что лично почерпнет интервьювер из такой детально решеной задачки кроме того что кандидат может написать атои?
ведь на все остальное времени не останется.
То, что я имел в виду:Alexander Troyansky wrote:Так получается:
Code: Select all
bool str2int(const char * str, int & res)
{
int tmp;
if (!str || !*str) return false;
bool bNeg = *str == '-';
if (bNeg) str++;
res = -(*str++ - '0');
if (res > 0 || res < -9) return false;
for(;*str;str++) {
char c = *str - '0';
if (c >= 0 && c <= 9) {
if ((tmp = 10*res-c) > res) return false;
else res = tmp;
}
else return false;
}
if (!bNeg)
if (res==MIN_INT) return false;
else res = -res;
return true;
}
Спасибо, так значительно лучше. Я только придерживаюсь своей изначальной точки зрения, что такая функция преобразования с учетом граничных условий не решается за 5-10 минут, если, конечно, человек не готовился заранее.АццкоМото wrote:То, что я имел в виду:Alexander Troyansky wrote:Так получается:тоже не ахти, но хотя бы проверок в цикле 2 вместо 6 (и 4х исполняемых при корректных данных)Code: Select all
bool str2int(const char * str, int & res) { int tmp; if (!str || !*str) return false; bool bNeg = *str == '-'; if (bNeg) str++; res = -(*str++ - '0'); if (res > 0 || res < -9) return false; for(;*str;str++) { char c = *str - '0'; if (c >= 0 && c <= 9) { if ((tmp = 10*res-c) > res) return false; else res = tmp; } else return false; } if (!bNeg) if (res==MIN_INT) return false; else res = -res; return true; }
Гм, внимание к деталям проверялось на каждом из собеседований в тот день, насколько я помню. На самом деле, я не считаю, что Гугл сильно зверел. То что глупо посыпался на граничных условиях и заранее не выяснил таблицу входов/выходов, из-за чего последнее интервью сам себе сильно изгадил -- это я так сам решил про себя. Почему самом деле не прошел - не знаю. Это было мое первое интервью в США, так что можно сказать первый блин комом.xtigr wrote:В этом случае еще куда ни шло, т.е. все остальное проверено, теперь проверяется внимание к деталям.Alexander Troyansky wrote:это была позиция тестера. Последнее интервью. Как-то получилось, что все собеседники уделяли минут 10-20 на общие вопросы: чего и как делал; почему Гугл... Остальное время на задачи всякие разные; по всей видимости, собеседующий хотел знать, как бы я работал в условиях недостатка данных/спецификаций типа "задавай вопросы". Простым упомянанием проверок я не отделался -- потребовалось кодирование на доске. Погорел классическим образом: упустил проверку граничных условий. Помню, что собеседователь очень распереживался.xtigr wrote:ну и зачем требовать такую детализацию во время интервью? Мне лично достаточно, если кандидат напишет пару строк кода, чтоб был понятен алгоритм, и чтоб упомянул про все проверки, можно просто словами.
Что лично почерпнет интервьювер из такой детально решеной задачки кроме того что кандидат может написать атои?
ведь на все остальное времени не останется.
Однако срезать на том что забыли проверять граничные условия как то черезчур. Этого как раз я и не понимаю и не принимаю. Особенно если человек с опытом ( не знаю как у вас).
Однако Гугл и МСФТ знамениты такими требованиями, так как считают что лучше срезать много хороших кандидатов чем взять одного плохого.
вообше-то изначально задача формулировалась как:"преобразовать строку в целое число". На какую позицию было интервью - не указывалось. Если ко мне придет человек интервюироваться на архитекта и в данном случае начнет писать атои, меня удар хватит. Я бы скорее ожидала что человек раскажит какие строки он может представить на входе. Если строка представляет собой целое число, нужно вызвать атои. Если число не целое, записано в десятичной форме то ...Интеррапт wrote:atoi эксп числа не обрабатывает. Когда кандидату задается вопрос, то в принципе такие вещи идут в постановке задачи - преобразуй ка ты мне, голубчик, обычную целочисельную строку с поддержкой +/- в число. Все, увидел, что чувак умеет код писать - поехали дальше, к более интересным задачам.Ljolja wrote:А если число в ехпоненциальной орме?