Мы подготовили для Вас новый выпуск, ставшей уже традиционной, ITренировки — подборки задач с собеседований в IT-компании мира.
В отобранные задачи попали задачи с собеседований Samsung. Соискателю также могут задать вопрос про шифр и Шерлока Холмса (нет, не пляшушие человечки, как можно было подумать). Уровень сложности мы постарались варьировать — от простых до серьезных.
Ответы будут даны в течение следующей недели — успейте решить. Удачи!
В отобранные задачи попали задачи с собеседований Samsung. Соискателю также могут задать вопрос про шифр и Шерлока Холмса (нет, не пляшушие человечки, как можно было подумать). Уровень сложности мы постарались варьировать — от простых до серьезных.
Вопросы
- Faulty machine
We have 10 machines that produce screws, each weighing 1 gram. One of the machines, however, produces screws weighing 0.9 grams only. We are allowed only one weighing and need to determine which machine is faulty.
ПереводУ нас есть 10 машин, производящих винты, каждый весом в 1 грамм. Правда, одна из машин производит винты весом 0,9 грамм. Нам разрешено произвествие только одно взвешивание (прим. винтов), чтобы найти машину, производящую бракованные винты.
- Holmes and cipher
Sherlock Holmes was decoding an encrypted message. If in the encryption, DISTANCE is written as IDTUBECN and DOCUMENT is written as ODDVNTNE.
Can you help him decipher HTTQYAD?
ПереводШерлок Холмс разгадывает зашифрованное сообщение. В шифре, DISTANCE обозначено как IDTUBECN, а DOCUMENT — как ODDVNTNE.
Сможете ли Вы помочь ему расшифровать HTTQYAD?
Задачи
- Research center and rare elements
A Research team want to establish a research center in a region where they found some rare-elements.They want to make it closest to all the rare-elements as close as possible so that they can reduce overall cost of research over there.It is given that all the rare-element’s location is connected by roads.It is also given that Research Center can only be build on road.Team decided to assign this task to a coder.If you feel you have that much potential..Here is the Task :- Find the optimal position of research center from given locations of rare-elements.
Locations are given in the matrix cell form where 1 represents roads and 0 no road. Number of rare-element and their location was also given(number<=5) and order of square matrix was less than equal to (20).
ПереводИсследовательская команда хочет основать центр исследований в регионе, где найдены некоторые редкие элементы. Они хотят расположить его максимально близко ко всем источникам элементов, чтобы снизить общие затраты. Источники элементов соединены дорогами. Также, исследовательский центр может быть построен только возле дороги. Команда решает поручить задачу разработчику, и, если Вы чувствуете свой потециал — найдите оптимальное расположение центра, исходя из локаций элементов.
Локации даны в виде матрицы, где 1 в ячейке означает наличие дороги, а 0 — её отсутствие.
Также даны локации элментов (числом <= 5). Порядок квадратной матрицы <= 20. - Stack down or up
In a typical process, a stack segment of program contains local variables along with information that is saved each time a function is called. Each time a function is called, the address of where to return to and certain information about the caller’s environment, such as some of the machine registers, are saved on the stack. The newly called function then allocates room on the stack for its automatic and temporary variables.
Stack may grow downward or upward depending on environment for which code is compiled, i.e., depends on compiler. Write down the program to determine whether stack grows downward or upward?
ПереводОбычно, сегмент стека программы содержит локальные переменные с информацией, сохраняемой при каждом вызове функции. Когда вызывается функция, в стек сохраняется адрес возврата и информация об окружении — например, некоторые регистры. Затем вызываемая функция занимает место в стеке для своих автоматических и временных переменных.
Стек может расти вниз или вверх в зависимости от среды, для которой скомпилирован код, т. е. зависит от компилятора. Реализуйте программу для определения, растет ли стек вниз или вверх. - Next greater element
Given an array, print the Next Greater Element (NGE) for every element. The Next greater Element for an element x is the first greater element on the right side of x in array. Elements for which no greater element exist, consider next greater element as -1.
Examples:
a) For any array, rightmost element always has next greater element as -1.
b) For an array which is sorted in decreasing order, all elements have next greater element as -1.
c) For the input array [4, 5, 2, 25], the next greater elements for each element are as follows.
Element NGE 4 --> 5 5 --> 25 2 --> 25 25 --> -1
d) For the input array [13, 7, 6, 12], the next greater elements for each element are as follows.
Element NGE 13 --> -1 7 --> 12 6 --> 12 12 --> -1
ПереводДан массив, напечатайте следующий больший элемент (NGE) для каждого из элементов. Следующим большим элементом для x является первый больший элемент с правой стороны от x в массиве. Если такого элемента не существует — NGE считается -1.
Примеры:
a) Для любого массива, крайний правый элемент всегда имеет NGE = -1.
b) Для любого массива, отсортированного по убыванию, все элементы имеют NGE = -1.
c) Для элементов массива [4, 5, 2, 25] NGE будет следующим:
Элемент NGE 4 --> 5 5 --> 25 2 --> 25 25 --> -1
d) Для элементов массива [13, 7, 6, 12] NGE будет следующим:
Элемент NGE 13 --> -1 7 --> 12 6 --> 12 12 --> -1
Ответы будут даны в течение следующей недели — успейте решить. Удачи!
KYKYH
А почему во втором вопросе ответ
StanislavMikheyev
Я точно не знаю, но я получил ответ так — первые две буквы надо поменять местами, последние 3 записать в обратном порядке, а каждую букву в центре заменить на следующую в алфавите.
mird
вот только в вопросе каждая буква в центре заменяется на предыдущую. Кажется, в задаче ошибка… Ну либо правильный ответ Thursday, а алгоритм сложнее.
ProstoUser
На Thursday букв не хватает. В задаче их 7, а не 8.
У меня THSPDAY получилось
mird
Дело в том, что предыдущие слова все по 8 символов. Так что, скорее всего, тут ошибка в условии (даже две).
unknown_geo
По идее для расшифровки буквы в центре надо заменять на предыдущие в алфавите: в шифре IDTUBECN в центре это будут DISTANCE. Поэтому в зашифрованном HTTQYAD это должны быть THSPDAY. Похоже на ошибку в вопросе
paratagas
У меня получилось THURDAY, а для того, чтобы было THURSDAY, в вопросе должно было быть слово HTTQRYAD.
smer44
я тож в уме прикинул, если так сделать будет th???day а единственное слово в английском которое подходит это thursday,, буквы в центре рандомные для запутывания?
iva666ka
написавший был русским шпионом, поэтому сделал ошибку в слове. Но ответ такой, да.
jmdorian
jmdorian
ProstoUser
Думаю, не верно. В рамках одного вызова ни кто не гарантирует (даже не упоминает) порядок расположения локальных переменных в стеке.
Ну и сравнение указателей так просто не сработает. Надо к интам закастить.
Примерно так:
Вызвать исходно с нулем. Если вернет 1, значит стек растет сверху вниз.
Тут рекурсия — последовательный вызов, так что гарантировано локальная переменная из первого экземпляра раньше по стеку, чем та же переменная из второго экземпляра.
jmdorian
Согласно этому указатели таки можно сравнивать as is.
ProstoUser
Да. Я не прав. С какой стати это мне пришло в голову — понятия не имею.
Действительно, указатели одного типа можно сравнивать на больше/меньше непосредственно.
creat0r
А если нет никаких уточнений про механизм «weighing», почему бы не
Kanut79
Потому что в этом нет необходимости и всё решается с обычными весами :)
AndyPike
Весы одни. Взвешивание одно.
Сваливаем всё в кучу и идем взвешивать.
Ответ: 10 — (wight % 1) * 10.
creat0r
Ну это тривиальное решение которое я
заведомо зналподсмотрел бы в комментариях выше. Моё — альтернативное и с инженерной точки зрения по некоторым критериям даже более подходящее.Kanut79
Я если честно немного сомневаюсь что люди, задающие такие задачи на собеседованиях, придерживаются такого же мнения :)
AndyPike
Я тоже сомневаюсь, что у них там есть несколько вариантов решения, скорее всего одно. В чём и проблема для таких тестов — только да/нет. Если же общаешься с реальным заинтересованным человеком — его может весьма заинтересовать необычный подход к проблеме.
В реальной жизни — почти любую задачу можно решить не одним, а 3-мя вариантами как минимум. В результате:
1) В уме: «Это ответ не правильный, у меня такого в вариантах нет», вербально: «Не правильно».
2) В уме: «Я тут начальник, не понял, слишком умный что-ли?», вербально: «Вы нам не подходите».
3) В уме: «Хм… интересно, как я до этого не додумался...»
Kanut79
Это если вас берут на должность где требуется необычный подход. А вот если вас берут на должность программиста, а вы каждый раз вместо того чтобы использовать существующие решения/программы/фреймворки, начинаете придумывать свои «альтернативные», то не думаю что это обрадует вашего работодателя :)
А в результате всех интересует тот, который наиболее эффективен(при учёте всех необходимых требований естественно). А ваш способ эффективным назвать сложно.
П.С. И поймите меня правильно, я не говорю что ваша идея глупа или не нужна в принципе. Я сам иногда тендирую к поиску «нестандартных решений». Но в контексте задач для собеседований такой подход не особо правильный.
AndyPike
У нас тоже довольно большая команда, давно уже.
И перехожу уже с темы набора — от претендентов на реальную работу.
По претендентам максимальный плюс может выдать только TL или кто там главный в проекте. Но до него не дойдёт, отсеют по формальным признакам. Шлак. Тест не прошёл.
Мы отказались от этого.
Kanut79
Ну если переходить на конкретику, то мы от подобных задач на собсеседованиях отказались. Потому что умение их решать на мой взгляд ничего не говорит ни о том как человек может работать в команде, ни о том насколько хорошо и грамотно он умеет программировать.
Максимум что мы делаем это даём потенциальным сениорам пример «кривого» на наш взгляд кода и спрашиваем что человек в нём поменял бы и почему. А потом просто смотрим куда приведёт обсуждение.
AndyPike
Полностью согласен. Эта первая задачка тривиальна — для затравки, наверно.
Да, ваше решение действительно красивое и креативное, если понятие «весы» не определено.
maslyaev
Не знаю, какой хитрый алгоритм подразумевался в 3-й задаче, но через моё дерево двоичного поиска делается легко и красиво:
Asyroc
Хитрость в том,
maslyaev
Валится на первом тесткейсе:
А должно быть [5, 25, 25, -1]qw1
Тоже рассматривал в точности такой вариант. Решение простое, но неверное.
Для массива [1,2,3] оно выдаст [3,3,-1], а надо [2,3,-1].
Asyroc
Упс. Ошибочка вышла
mbait
WA на тесте [3, 1, 2, 4]
domix32
[-1, 2, 4, -1]
да вроде все верно выдало
reci Автор
Должно быть [4, 2, 4, -1]
amidaleet
Ошибка в том, что идти нужно с конца, но сравнивать необходимо не с одним числом (максимумом), а проверять все возможные числа идущие следом в исходом массиве (или уже отобранные greaterNumbers).
Под спойлером код на Swift c комментариями, достаточно простой чтобы понять суть алгоритма.
Ошибка
qw1
Идея идти с конца появилась, чтобы получить линейную сложность.
Если сложность решения всё равно O(n^2), зачем что-то запутывать?
Можно решить самым простым и наглядным способом, тоже за O(n^2): идти от начала вперёд, и от каждого элемента снова вперёд, пока не найдёшь больший, чем текущий.
amidaleet
Да, действительно, я написал очень плохую реализацию, не использующую преимуществ обхода с конца и с лишними проверками.
А смысл был в том, чтобы на каждой итерации получать некоторую ценную информацию позволяющую в будущем не сравнивать элемент с заведомо меньшими числами.
Например в отрывке [10, 8, 6, 5, 4, 3, 2, 7, 9, 12] мы не хотим для 10 лишний раз пробегаться по [6, 5, 4, 3, 2, 7] потому что они заведомо меньше 8, что мы уже знаем совершив поиски NGE для 8. Саму 8 проверять таки придётся, потому что ища NGE для 8 мы не знаем ещё о стоящем слева числе и заведомо вышвырнуть не можем.
Будем искать NGE с конца по элементам исходного массива.
Если searchArea не пуст, сверяем последнее число в searchArea с элементом, если оно меньше или равно, то выкидываем его из searchArea (для следующих элементов в исходном массиве выкинутый элемент не может оказаться NGE, так как текущий для них и больше и ближе). Так пока searchArea не опустеет или пока не наткнёмся на большее число в нём – наш NGE.
Наткнулись на NGE – запишем в результирующий массив NGEs.
Обязательно добавляем текущий элемент в searchArea, ведь наш текущий элемент может стать NGE для отстоящих слева.
qw1
Задача про стек
www.onlinegdb.com/HJuG7efkX
mbait
Это вопросы из корейского самсунга что ли, или почему английский такой корявый? Или вы сами придумываете задачи, потом их коряво переводите и выдаёте за оригинал?
reci Автор
Что Вы имеет против корейского Самсунга? )
Английский вариант обычно публикуем без изменений, если ошибки не влияют на смысл.
ps. Кстати, большая часть вопросов — из азиатского сегмента (Индия, Китай, Япония, Корея)
mbait
Ничего не имею. Просто если так, то понятно, а от американского Сансунга (а именно там много software и R&D отделов) странно было бы такое получить.
nickolaym
1 винт от 1 машины, 2 винта от 2 машины и т.д.
найти дефект массы и поделить на единичный дефект, получим номер машины
nickolaym
задача 1. как-то очень криво сформулирована.
Приходится домысливать за топикстартера! Всё по-взрослому, вот тебе хотелки, сам себе сделай ТЗ!
Поэтому под кат не прячу. Пусть будет спойлер, а авторам пусть будет стыдно.
Допустим, так. Локации пронумерованы. Дана матрица смежности. Если локации смежные, то расстояние между ними 1. В некоторых локациях есть источники (потому что локаций — до 20 — по размеру матрицы, а источников — до 5).
Тупое решение, благо, размер матрицы позволяет.
Получаем матрицу расстояний из матрицы смежности. Это — тупо, возвести матрицу смежности в 20 степень, где (умножение) — это сложение, а (сложение) — это минимум. А единичка смежности считается 1 расстояния, нолик смежности считается бесконечностью, а на диагонали стоят 0. (расстояние до самих себя, естественно, нулевое).
Для каждой локации посчитать сумму расстояний до всех источников.
nickolaym
элементарно ватсон!
nickolaym