Привет! Мы снова подготовили Вам подборку интересных вопросов и задачек с собеседований в ведущие IT-компании!
Выпуски будут появляться каждую неделю — следите за обновлениями! Рубрика выходит при поддержке рекрутингового агентства Spice IT.
На этой неделе мы собрали задачи с собеседований в индийскую компанию Snapdeal. Кстати, ответы на задачки из прошлого выпуска уже опубликованы.
1. Car Wheel Puzzle
2. Completion of Task
1. Next greater number set digits
2. Coin Change
3. Phone directory
Ответы на задачи будут даны в течение следующей недели — успейте решить. Удачи!
Выпуски будут появляться каждую неделю — следите за обновлениями! Рубрика выходит при поддержке рекрутингового агентства Spice IT.
На этой неделе мы собрали задачи с собеседований в индийскую компанию Snapdeal. Кстати, ответы на задачки из прошлого выпуска уже опубликованы.
Вопросы
1. Car Wheel Puzzle
A car has 4 tyres and 1 spare tyre. Each tyre can travel a maximum distance of 20000 miles before wearing off. What is the maximum distance the car can travel before you are forced to buy a new tyre? You are allowed to change tyres (using the spare tyre) an unlimited number of times.
Перевод
Автомобиль имеет 4 шины и 1 запасную шину. Каждая шина может пройти максимальное расстояние в 20000 миль, прежде чем прийти в негодность. Какое максимальное расстояние может проехать автомобиль, прежде чем вы будете вынуждены купить новую шину? Вы можете менять шины (используя запасную шину) неограниченное количество раз.
2. Completion of Task
A man is allocated a task. He doubles the task done everyday. If the man completely does the task in 18 days, how many days did it take for the man to complete 25% of the task?
Перевод
Человеку дается задание. Каждый день он увеличивает свой прогресс в данном задании вдвое. Если человек полностью выполняет задание за 18 дней, то сколько дней ему потребовалось, чтобы выполнить 25% задания?
Задачи
1. Next greater number set digits
Given a number n, find the smallest number that has same set of digits as n and is greater than n. If n is the greatest possible number with its set of digits, then print “not possible”.
Input:
The first line of input contains an integer T denoting the number of test cases.
The first line of each test case is n,n is the number.
Output:
Print the greater number than n with same set of digits and if not possible then print «not possible» without double quote.
Constraints:
1 ? T ? 100
1 ? n ? 100000
Example:
Input
2
143
431
Output
314
not possible
Перевод
Дано число n, найдите наименьшее число, которое имеет тот же набор цифр, что и n, и больше n. Если n — это и есть максимально возможное число с его набором цифр, то выведите “not possible”.
Ввод:
Первая строка входных данных содержит целое число T, обозначающее количество тестов.
Первая строка каждого теста — n. n — это число.
Вывод:
Выведите большее число, чем n, с тем же набором цифр, и если это невозможно, то выведите «not possible».
Ограничения:
Пример:
Ввод
Вывод
Ввод:
Первая строка входных данных содержит целое число T, обозначающее количество тестов.
Первая строка каждого теста — n. n — это число.
Вывод:
Выведите большее число, чем n, с тем же набором цифр, и если это невозможно, то выведите «not possible».
Ограничения:
1 ? T ? 100
1 ? n ? 100000
Пример:
Ввод
2
143
431
Вывод
314
not possible
2. Coin Change
Given a value N, find the number of ways to make change for N cents, if we have infinite supply of each of S = { S1, S2,…, Sm} valued coins. The order of coins doesn’t matter. For example, for N = 4 and S = {1,2,3}, there are four solutions: {1,1,1,1},{1,1,2},{2,2},{1,3}. So output should be 4. For N = 10 and S = {2, 5, 3, 6}, there are five solutions: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} and {5,5}. So the output should be 5.
Input:
The first line contains an integer 'T' denoting the total number of test cases. In each test cases, the first line contains an integer 'M' denoting the size of array. The second line contains M space-separated integers A1, A2, ..., AN denoting the elements of the array. The third line contains an integer 'N' denoting the cents.
Output:
Print number of possible ways to make change for N cents.
Constraints:
1 ? T ? 50
1 ? N ? 300
1 ? A[i] ? 300
Example:
Input:
2
3
1 2 3
4
4
2 5 3 6
10
Output:
4
5
Explanation:
Testcase 1: The possiblities are as such: {1, 1, 1, 1}, {1, 1, 2}, {1, 3}, {2, 2}.
Перевод
Дано значение N, найдите количество способов разменять монету N, если у нас есть бесконечный набор каждой монеты таких номиналов S = { S1, S2, ...,., Sm}. Порядок монет не имеет значения. Например, для N = 4 и S = {1,2,3} существует четыре решения: {1,1,1,1},{1,1,2},{2,2},{1,3}. Так что вывести нужно 4. Для N = 10 и S = {2, 5, 3, 6}, существует пять решений: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} и {5,5}. Так вывести нужно 5.
Ввод:
Первая строка содержит целое число 'T', обозначающее общее количество тестов. В каждом тесте первая строка содержит целое число 'M', обозначающее размер массива. Вторая строка содержит M целых чисел, разделенных пробелами A1, A2,..., обозначающие элементы массива. Третья строка содержит целое число 'N', обозначающее сумму.
Вывод:
Выведите количество возможных способов размена суммы N.
Ограничения:
Пример:
Ввод:
Вывод:
Объяснение:
Тест 1: возможности таковы: {1, 1, 1, 1}, {1, 1, 2}, {1, 3}, {2, 2}.
Ввод:
Первая строка содержит целое число 'T', обозначающее общее количество тестов. В каждом тесте первая строка содержит целое число 'M', обозначающее размер массива. Вторая строка содержит M целых чисел, разделенных пробелами A1, A2,..., обозначающие элементы массива. Третья строка содержит целое число 'N', обозначающее сумму.
Вывод:
Выведите количество возможных способов размена суммы N.
Ограничения:
1 ? T ? 50
1 ? N ? 300
1 ? A [i] ? 300
Пример:
Ввод:
2
3
1 2 3
4
4
2 5 3 6
10
Вывод:
4
5
Объяснение:
Тест 1: возможности таковы: {1, 1, 1, 1}, {1, 1, 2}, {1, 3}, {2, 2}.
3. Phone directory
Given a list of contacts which exist in a phone directory and a query string str. The task is to implement search query for the phone directory. Run a search query for each prefix p of the query string str(i.e from index 1 to str length) that prints all the distinct recommended contacts which have the same prefix as our query (p) in lexicographical order. Please refer the explanation part for better understanding.
NOTE: If there is no match between query and contacts, print «0».
Input:
The first line of input contains an integer T denoting the number of test cases. Then T test cases follow. Each test case contains three lines. First line of each test case contains N i.e., number of contacts. Second line contains space separated all the contacts in the form of string. And third line contains query string.
Output:
For each test case, print each query result in new line. If there is no match between query and contacts, print «0».
Constraints:
1<=T<=100
1<=N<=50
1<=|contact[i].length|<=50
1<=|query length|<=6
Example:
Input:
1
3
spiceit spcicecite spiiceti
spicpt
Output:
spiceit spcicecite spiiceti
spiceit spcicecite spiiceti
spiceit spiiceti
spiceit
0
0
Explanation:
By running the query on contact list, we get,
Suggestions based on "s" are:
spiceit spcicecite spiiceti
Suggestions based on "sp" are:
spiceit spcicecite spiiceti
Suggestions based on "spi" are:
spiceit spiiceti
Suggestions based on "spic" are:
spiceit
No Results Found for «spicp», So print «0».
No Results Found for «spicpt», So print «0».
Перевод
Дан список контактов, которые есть в телефонном справочнике и строке запроса str. Задача состоит в том, чтобы реализовать поисковый запрос для телефонного справочника. Выполните поисковый запрос для каждого префикса p строки запроса str (т. е. от индекса 1 до длины str), который печатает все отдельные рекомендуемые контакты, имеющие тот же префикс, что и наш запрос (p) в лексикографическом порядке. Пожалуйста, обратитесь к пояснительной части для лучшего понимания.
Примечание: если запрос и контакты не совпадают, выведите «0».
Ввод:
Первая строка входных данных содержит целое число T, обозначающее количество тестов. Затем следуют T тестов. Каждый тест содержит три строки. Первая строка каждого теста содержит N, т. е. количество контактов. Вторая строка содержит пробел, разделяющий все контакты в виде строки. А третья строка содержит строку запроса.
Вывод:
Для каждого теста выведите каждый результат запроса в новой строке. Если между запросом и контактами нет совпадения, выведите «0».
Ограничения:
Пример:
Ввод:
Вывод:
Объяснение:
Запустив запрос по списку контактов, мы получаем,
Результаты поиска "s", таковы:
Результаты поиска "sp", таковы:
Результаты поиска "spi", таковы:
Результаты поиска "spic", таковы:
Для «spicp» не найдено результатов, поэтому вывели «0».
Для «spicpt» не найдено результатов, поэтому вывели «0».
Примечание: если запрос и контакты не совпадают, выведите «0».
Ввод:
Первая строка входных данных содержит целое число T, обозначающее количество тестов. Затем следуют T тестов. Каждый тест содержит три строки. Первая строка каждого теста содержит N, т. е. количество контактов. Вторая строка содержит пробел, разделяющий все контакты в виде строки. А третья строка содержит строку запроса.
Вывод:
Для каждого теста выведите каждый результат запроса в новой строке. Если между запросом и контактами нет совпадения, выведите «0».
Ограничения:
1<=T<=100
1<=N<=50
1<=|contact[i].length|<=50
1<=|длина запроса|<=6
Пример:
Ввод:
1
3
spiceit spcicecite spiiceti
spicpt
Вывод:
spiceit spcicecite spiiceti
spiceit spcicecite spiiceti
spiceit spiiceti
spiceit
0
0
Объяснение:
Запустив запрос по списку контактов, мы получаем,
Результаты поиска "s", таковы:
spiceit spcicecite spiiceti
Результаты поиска "sp", таковы:
spiceit spcicecite spiiceti
Результаты поиска "spi", таковы:
spiceit spiiceti
Результаты поиска "spic", таковы:
spiceit
Для «spicp» не найдено результатов, поэтому вывели «0».
Для «spicpt» не найдено результатов, поэтому вывели «0».
Ответы на задачи будут даны в течение следующей недели — успейте решить. Удачи!
andyudol
В начале первого дня у него, естественно, 0%. За день он увеличивает прогресс вдвое. 0%?2=0%. И так далее.
Хорошая ловушка.
BASic_37
Никакой ловушки. Он увеличивает прогресс вдвое, за предыдущий день, поэтому брать надо достигнутый прогресс на конец дня. А вообще тут не важно сколько он сделал за день…
18 дней: 100%
17 дней: 100% / 2 = 50%
16 дней: 50% / 2 = 25%
Ответ: 16 дней
andyudol
Именно так. Сколько он сделал за предыдущий первому? 0!
Ага! Только этот фокус работает, если в первый день он сделал 100?2-18% всей работы. А этой информации в условии задачи нет.
Важно, с какой доли он начал. Если с нуля, то он никогда не кончит.
BASic_37
С чего вы это взяли? По условию задачи он все таки делал какую-то работу и делал он ее с двукратным приростом, так что в 18-ый день он полностью (100%) ее закончил.
Это (100%) опять же по условию задачи, ваш расчет (0%?2=0%) противоречит данному условию, оно бы никогда не выполнилось.
Логично предположить что начал он его с 0 и в первый день сделал какую то часть работы.
Я не вижу здесь никакого подвоха…
andyudol
Вот именно. Противоречивое условие задачи. Или каждый день вдвое, или задача выполнена на 100%.
MaxVetrov
Хорошо, вы нашли противоречие. Что бы вы добавили в условие задачи чтобы этого противоречия не существовало, при этом не добавилось какое-то новое противоречие?
andyudol
Убрать «каждый день».
С другой стороны, это же собеседование. Если испытуемый решил выпендриться, поговорить с ним. В том числе, попросить скорректировать условие задачи. Может быть он годится на что-то большее, чем «Чего изволите?».
MaxVetrov
Получается:
Верно?andyudol
Но про закономерность-то надо написать.
MaxVetrov
В том то и дело, убрать «каждый день» — тоже может приводить к противоречию.
Чтобы нам не путаться, не могли бы вы написать полный текст исправленного вопроса?
Ac0olA Автор
Здравствуйте! Давайте добавим такую оговорку про первый день, тогда условие задачи должно быть полным и не иметь противоречий:
Человеку дается задание. В первый день он выполняет некоторую часть задания. Каждый последующий день он увеличивает свой прогресс в данном задании вдвое. Если человек полностью выполняет задание за 18 дней, то сколько дней ему потребовалось, чтобы выполнить 25% задания?
Однако, в условии задачи сказано о том, что «человек полностью выполняет задание за 18 дней». Это значит, что все-таки такого случая, когда в первый день он выполнил 0% задания и каждый последующий день будет удваивать свой прогресс (0% х 2 = 0%) — быть не может.
MaxVetrov
Здравствуйте!
Все верно, вводится база индукции. И формулировка становится точнее. Но увы, даже точная формулировка может приводить к противоречиям — «Как выделиться тем кто находит противоречия?». Также возникают вопросы «Нужен ли тот кто находит постоянно противоречия?», «Сможет ли человек решать задачи если он постоянно находит проблемы, но не решения?», «Не будет ли проблем, если нужно все очень детально объяснять?», «Нужно ли немножко запутать кандидата?».Да, такого быть не может и все прекрасно это поняли.
Все зависит от того какое утверждение выбирается истинным в условиях противоречия. Утверждение может быть либо «истинным», либо «ложным», у вас это утверждение оказалось истинным, а у @aandyudol — 0%?2=0%, они друг друга взаимоисключают.
andyudol
Не будет, если сформулировать как-то так: выполнил за 18 дней, а за каждый предыдущий — в два раза меньше. Но тогда и задача исчезает.
MaxVetrov
Да, она упрощается.
В школе, решал трехэтажные длинные выражения, и всегда удивлялся «как в конце получаются такие маленькие-ровные числа?» А потом понял, что задачи составляют с конца(ответа).
Формулировка Ac0olA, вполне себе подходит.
Можно даже добавить «гаек для сборки»(избыточные данные) — нет противоречий, а запутать можно. Например, указать конкретный начальный элемент, увеличить количество дней, и пусть решают с начала.)
Можно, даже проверить бдительность, поставив неверное значение начального элемента.
BASic_37
1. Car Wheel Puzzle
Посчитать можно например так: полный ресурс всех пяти колес делим на износ всех колеса-мест, получаем сколько будет износ на колесо-месте и умножаем на износ одной шины.
(100000/80000)*20000=25000
100000/80000=1,25 — эти 0,25 это то превышение нормального износа, через сколько надо менять очередное колесо (20000*0,25=5000)
Какое-то замысловатое объяснение у меня получилось…
CoreTeamTech
Все не так просто, поставьте в ваши рассуждения значение износа равное 10 миль. Нужно учитывать что вы «приехали», если любые 2 колеса достигли состояния износа.
andyudol
Всё равно 1,25. Одно колесо достигнет износа через 20000, остальные ещё через 5000. Надо всего лишь чтобы каждое колесо проехало 5000 в багажнике.
BASic_37
Все нормально получается хоть с 10 милями:
Желтым — колесо в запасе. К концу пути все колеса имеют 100% износ.
CoreTeamTech
Да, вы правы. У меня был другой ход мыслей (сильнее запутанный :) и я посчитал нулевую точку (милю) отсчета и получил 14 вместо 13 для предела износа в 10 миль. Каюсь.
MaxVetrov
У меня другой вопрос: «Сможет ли водитель проехать максимальную дистанцию, если он проморгал очередную смену покрышек?»
BASic_37
Нет, если проморгал, то максимум уже не получится. С другой стороны, если говорить о реальном мире, тогда вопрос: «Выйдет ли покрышка из строя проехав ровно свой ресурс?». Это риторический вопрос, предлагаю дальше не раздувать тему…
MaxVetrov
Да, хороший вопрос. Я не пытаюсь раздувать тему, я, просто, побуждаю к решению банальных узко-изолированных задач другими способами. Вы нашли решение — класс. Как насчет того, чтобы подумать «А является ли мое решение единственным?», «Как можно оптимизировать?», «Какие есть узкие места?».
Решать задачи которые имеют одно решение, все равно что тренировать условный рефлекс, но рефлекс — это не творчество.
Что если менять колеса в два раза чаще? Решит ли это проблему водителя с пропуском очередной смены покрышек?
BASic_37
Это может уменьшить неоптимальность износа, все зависит от того, по какой причине он пропускает смену. Если у него, например, стоит какая то напоминалка и он одну из них пропустил, то минимизирует, а если он просто забыл, то это не поможет. Но если есть еще какой то запас, то после того как он вспомнил, он может скорректировать план по смене колес…
И можно еще придумать много если, и потом придумывать много сложных алгоритмов оптимизации, поэтому предлагаю лучше сделать все что бы не допустить такую забывчивость (а следовательно и не допустить усложнение кода, тестирование, потенциальные ошибки, трату ресурсов — мы же говорим о задачи для программиста). Сделаем напоминание и контроль за выполнением, а может и вообще сделаем замену колес за него.
P.S. Но это все таки уже другая задача…
MaxVetrov
Не суть по какой причине, водитель пропустил смену. Задачу можно перевести в другую плоскость. Допустим, у нас водителем является ИИ, и смена покрышек производится автоматически. Автомобиль не может сменить покрышки в движении, ему нужно остановится. Автомобиль не может остановиться в любое время, на оживленных трассах это не желательно. Соответственно всегда будет отклонение от нормы, задача найти алгоритм, с помощью которого можно корректировать поведение программы.
Нахождение алгоритмов задача программиста?
BASic_37
Чувствую, я попал на собеседование… )
В том числе
Если ИИ знает какой ему предстоит путь и что он не сможет вовремя произвести замену, лучше сделать это заранее, тем самым он сможет скорректировать график замены позже, и «добить» недоезженный ресурс на более коротких отрезках пути.
По сути алгоритм тот же, необходимо тратить ресурс покрышек равномерно на всех, по очереди, период замены можно менять:
если не добили какой то из периодов и известно что потребуется проехать не больше чем этот остаток то:
добиваем этот период на тех же колесах, на которых недоездили тот период
в противном случае оставляем на потом и начинаем новый цикл:
до замены осталось = остаток ресурса покрышки с максимальном износом / 4
если произвели досрочную замену на первой итерации в цикле:
можно провести замены в цикле с той же периодичностью, что и эту
Таким образом недоезженные периоды будут все время уменьшаться, т.е. минимизироваться не оптимальный случай
MaxVetrov
Я не собеседую, но возможно кого-то заинтересуют ваши ответы и ход рассуждений.
Да, период можно менять вплоть до бесконечно малых величин dt, для ровного распределения износа по покрышкам.
MaxVetrov
PS.
MaxVetrov