Сегодня мы подготовили последний выпуск ITренировки в текущем формате.
КДПВ
Мы подобрали для Вас задачи с собеседований в Cisco. Там задают вопросы не только про маршрутизацию и железо (в подборке есть такие вопросы), но и логические задачи. Наиболее интересные из них — ждут Вас под катом.

Нужно отметить также, что этот выпуск будет последним в данном формате, но будет продолжен в измененном виде. Мы решили поменять формат и площадку для последующих выпусков ITренировки — продолжение будет в Типичном программисте.

Вопросы


  1. Magnet, Magnetic and Nonmagnetic
    How can you differentiate among a magnet, magnetic material and nonmagnetic material?

    Перевод
    Как отличить магнит, магнитный материал и немагнит? (прим. Вопрос по железу в неожиданном ракурсе. Требует некоторых знаний физики)
  2. Viral infection
    The world is facing a serious viral infection. The government of various countries have issued every citizen two bottles. You as well have been given the same. Now one pill from each bottle is to be taken every day for a month to become immune to the virus. The problem is that if you take just one, or if you take two from the same bottle, you will die a painful death.

    While using it, you hurriedly open the bottles and pour the tablets in your hand. Three tablets come down in your hand and you realize they look exactly the same and have same characteristics. You can’t throw away the pill as they are limited and you can’t put them back or you may put it wrong and may die someday. How would you solve this problem?

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

    Принимая очередную порцию таблеток, Вы открываете обе бутыли и поспешно высыпаете таблетки в ладонь. Поздно, но Вы понимаете, что высыпалось три таблетки, а также то, что они выглядят абсолютно одинаково. Таблетку выбросить нельзя, поскольку их количество ограничено, и Вы не можете положить их обратно, иначе, в случае ошибки, Вы когда-нибудь умрете. Как бы Вы решили эту проблему?

    (прим. Похожая задача уже была в ранних выпусках.)

Задачи


  1. Sort elements by frequency
    Print the elements of an array in the decreasing frequency. If 2 numbers have same frequency then print the one which came first.

    Examples:

    Input: arr[] = {2, 5, 2, 8, 5, 6, 8, 8}
    Output: arr[] = {8, 8, 8, 2, 2, 5, 5, 6}

    Input: arr[] = {2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8}
    Output: arr[] = {8, 8, 8, 2, 2, 5, 5, 6, -1, 9999999}

    Перевод
    Выведите элементы массива в порядке убывания по частоте вхождения. Если два числа имеют одинаковую частоту — выводить первым то, что встречается первым.

    Примеры:

    Вход: arr[] = {2, 5, 2, 8, 5, 6, 8, 8}
    Выход: arr[] = {8, 8, 8, 2, 2, 5, 5, 6}

    Вход: arr[] = {2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8}
    Выход: arr[] = {8, 8, 8, 2, 2, 5, 5, 6, -1, 9999999}
  2. Check BST
    A binary search tree (BST) is a node based binary tree data structure which has the following properties.

    • The left subtree of a node contains only nodes with keys less than the node’s key.
    • The right subtree of a node contains only nodes with keys greater than the node’s key.
    • Both the left and right subtrees must also be binary search trees.

    From the above properties it naturally follows that:
    • Each node (item in the tree) has a distinct key.

                         4
                      /                     2        5
                  /                1       3
    

    Your task is to create a program to check if a binary tree is BST or not.

    Перевод
    Дано двоичное дерево поиска, которое имеет следующие свойства:
    * Левое поддерево для каждого узла содержит числа меньше значения данного узла.
    * Правое поддерево для каждого узла содержит числа больше значения данного узла.
    * И левое и правое поддеревья являются двоичными деревьями поиска.

    Из описанного следует, что каждый узел в дереве содержит уникальный ключ.

                         4
                      /                     2        5
                  /                1       3
    

    Ваша задача — написать программу для проверки, является ли дерево двоичным деревом поиска или нет.
  3. Liter, water and 2 smocking «coprime» vessels
    There are two vessels of capacities ‘a’ and ‘b’ respectively. We have infinite water supply. Give an efficient algorithm to make exactly 1 litre of water in one of the vessels. You can throw all the water from any vessel any point of time. Assume that ‘a’ and ‘b’ are Coprimes.

    Перевод
    Даны 2 сосуда емкостью 'a' и 'b' и бесконечный источник воды. Предложите эффективный алгоритм для отмера ровно 1 литра воды с помощью этих сосудов. Вы можете вылить всю воду из любого сосуда в любой момент времени. Примем также, что 'a' и 'b' взаимно простые числа.

Ответы будут даны в течение следующей недели — успейте решить. Удачи!

Комментарии (12)


  1. retran
    09.06.2018 16:07
    +2

    Задача про вирусную инфекцию:
    1. Отложим пока три таблетки и пересчитаем сколько осталось в бутылках. В одной из бутылок будет на одну таблетку больше. Заберем эту лишную таблетку и положим к трем высыпавшимся. Таким образом в куче высыпавшихся таблеток будет по две таблетки из каждой бутылки.
    2. Разломим каждую таблетку пополам. «Левые» половины сложим в одну кучу. «Правые» в другую.
    Таким образом, в каждой куче будет по две половинки таблетки из каждой бутылки. Или по одной целой таблетке из каждой бутылки.
    3. Сегодня съедим левую кучку, завтра съедим правую.


    1. j8kin
      09.06.2018 17:19

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


      1. retran
        09.06.2018 18:52

        «Нужно принимать по одной таблетке из каждой бутылки ежедневно в течении месяца, чтобы приобрести иммунитет к вирусу.»
        «Таблетку выбросить нельзя, поскольку их количество ограничено.»

        Их там не более 31.


        1. MaxVetrov
          11.06.2018 11:48

          Зато возникает другой вопрос: А одинаковое ли количество этих таблеток в каждой бутылке изначально?


    1. MaxVetrov
      10.06.2018 23:56
      +1

      Немного дополню по этой задаче (Эпидемия):

      У меня варианты следующие:
      1. Пойти к соседу-фармацевту, у него по-любому излишки остались.)
      2. Ничего не говорится о вкусе: просто попробывать на язык, а не придумывать хитроумные комбинации.
      3. Ничего не говорится о весе: просто взвешать.
      4. Ничего не говорится о молекулярном составе, а он точно разный(это же не плацебо): посмотреть в микроскоп(если он есть конечно)

      Ну а если действительно решать эту задачу, то предлагаю следующие шаги:

      1. Отложим эти 3 таблетки в 3-ю баночку(подпишем «тут лежит 3 таблетки»)
      2. Ну и кушаем до победного!!! То есть как врач прописал по одной из каждой баночки(лишь бы опять такого случая не произошло)
      3. В итоге в одной из баночек осталось одна таблетка.
      4. Вытаскиваем эту таблетку и 3 таблетки из 3-ей банки.
      5. Режем пополам, и кушаем 2 дня: одну половину таблеток в один день, другую — в другой.

      Преимущество данного метода в том, что таблетки считать не надо.


      1. MaxVetrov
        11.06.2018 11:10

        Еще один вариант:
        Положить все таблетки в одну кучу, растолочь, размешать до однообразной массы и разделить на оставшееся количество дней.


        1. MaxVetrov
          11.06.2018 11:23

          Правда, здесь нужно учитывать химическую активность данного соединения.


  1. andyudol
    10.06.2018 09:19
    +1

    Вопр. 1. Случай, когда перевод требует некоторого знания физики. Потому что «намагниченный материал» = «магнит». На самом деле имеются в виду магнит, магнитный материал (ферромагнетик) и немагнитный материал.
    Кроме того, условие нечётко сформулировано: можно ли применять дополнительные средства, например, железные опилки или нагрев? Предположим, что нельзя.
    Тогда проблема в различении магнита и магнитного материала. Воспользуемся тем, что сила притяжения магнитного материала к полюсу магнита больше, чем между полюсами (если бы кусок магнитного материала был точкой, = 0).


    1. reci Автор
      10.06.2018 09:56

      Замечание принято, спасибо.


  1. IgnisDeus
    10.06.2018 23:42

    1.

    int[] SortByFrequency(int[] arr) 
    {
     return arr
        .Select(i => new Tuple<int, int>(i, arr.Count(v => v == i)))
        .OrderByDescending(t => t.Item2)
        .ThenBy(t => t.Item1)
        .Select(t => t.Item1)
        .ToArray();
    }
    


    1. olen
      11.06.2018 20:47

      > If 2 numbers have same frequency then print the one which came first.
      .ThenBy(t => t.Item1) — отсортирует по возрастанию


      1. IgnisDeus
        11.06.2018 22:27

        Ох, не заметил. Тогда так должно работать как надо

        int[] SortByFrequency(int[] arr) 
        {
         return arr
            .GroupBy(i=>i)
            .OrderByDescending(g=>g.Count())
            .SelectMany(l=>l.ToArray())
            .ToArray();
        }