Мы подготовили для Вас новый выпуск с интересными задачами с собеседований в Apple.

КДПВ

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

Вопросы


  1. Gems and Pirates
    Seven pirates attacked the ship and looted some rare gems from them. They decided to rest for some time and then divide the gems later. While everyone was resting, two pirates wake up and planned to divide gems equally between the two. When they divided gems equally, one gem was left. So, they decided to wake up the third pirate and divide among three, but alas again one gem was left. They decide to wake up the fourth pirate to divide the gems and again one gem was left. The same happened again with the fifth and sixth. Finally, they woke up the 7th pirate and this time the gems were divided equally.
    How many minimum gems did they stole in total ?

    Перевод
    Семь пиратов захватили судно и добыли несколько драгоценных камней. Они решили отдохнуть и заняться дележём добычи позже. Пока все спали, 2 пирата проснулись и решили поделить камни между собой поровну. Когда они поделили, остался один камень. Тогда они решили разбудить ещё одного пирата и поделить камни поровну на троих, но когда они так и поступили — остался один камень. Они разбудили 4-го пирата и снова попробовали разделить сокровище, и снова остался один камень. Так же было и когда они разбудили пятого и шестого пиратов. Лишь когда они разбудили седьмого пирата, им удалось разделить все камни без остатка.
    Сколько (минимум) драгоценных камней составили добычу пиратов?

  2. Faulty coin & perfect coin
    I have two coins.
    * One of the coin is a faulty coin having tail on both side of it.
    * The other coin is a perfect coin (heads on side and tail on other).

    I blind fold myself and pick a coin and put the coin on table. The face of coin towards the sky is tail.

    What is the probability that other side is also tail?

    Перевод
    У меня 2 монеты:
    * Одна из них — неправильная монета, с решками на обеих сторонах.
    * Вторая монета — идеальная монета (орел на одной стороне, и решка на обратной).

    Я, с завязанными глазами, беру монету и подбрасываю её на стол. Видимая часть монеты — решка.

    Какова вероятность, что на обратной стороне — тоже решка?


Задачи


  1. Print all nodes at distance k
    Given a binary tree, a target node in the binary tree, and an integer value k, print all the nodes that are at distance k from the given target node. No parent pointers are available.

    Consider the tree shown in diagram:
     
                                  20
                                 /                               8    22
                              /                           4      12
                                  /                                10    14
    


    Input: target = pointer to node with data 8; root = pointer to node with data 20; k = 2.
    Output: 10 14 22

    If target is 14 and k is 3, then output should be “4 20”

    Перевод
    Дано бинарное дерево, выбранный узел дерева и целое число k. Напечатайте все узлы дерева, которые находятся на дистанции k от целевого узла. Родительские ссылки не доступны.

    Рассмотрим дерево:
     
                                  20
                                 /                               8    22
                              /                           4      12
                                  /                                10    14
    


    Вход: target = указатель на узел 8; root = указатель на узел 20; k = 2.
    Выход: 10 14 22

    Если target = 14 и k = 3, тогда выход должен быть “4 20”.

  2. Car assembly task
    A car factory has two assembly lines, each with n stations. A station is denoted by Si,j where i is either 1 or 2 and indicates the assembly line the station is on, and j indicates the number of the station. The time taken per station is denoted by ai,j. Each station is dedicated to some sort of work like engine fitting, body fitting, painting and so on. So, a car chassis must pass through each of the n stations in order before exiting the factory. The parallel stations of the two assembly lines perform the same task. After it passes through station Si,j, it will continue to station Si,j+1 unless it decides to transfer to the other line. Continuing on the same line incurs no extra cost, but transferring from line i at station j – 1 to station j on the other line takes time ti,j. Each assembly line takes an entry time ei and exit time xi which may be different for the two lines. Give an algorithm for computing the minimum time it will take to build a car chassis.

    Перевод
    Машинная фабрика имеет 2 сборочные линии, каждая с N станций. Станция определяется Si,j, где i, могущая принимать значения 1 или 2, обозначает линию, на которой находится станция, а j — обозначает номер станции. Время затрачиваемое станцией обозначается как ai,j. Каждая станция предназначена для выполнения определенного вида работы — подгонки двигателя, подгонки корпуса, покраски и т.д. Так, ходовая часть машины должна пройти через все n станций в определенном порядке, прежде чем будет выпущена с завода. Параллельные станции на обеих сборочных линиях выполняют одинаковую задачу. После того, как деталь пройдёт станцию Si,j, она продолжит движение через Si,j+1, если не будет принято решение перевести её на другую линию. Переход от станции к станции на одной линии не требует дополнительного времени, но перевод со станции j-i на станцию j на другой линии — требует времени ti,j. Каждая сборочная линия также имеет входное время ei и выходное время xi, которое может быть различным для обеих линий. Предложите алгоритм с минимальным временем сборки машины.

  3. Search in sorted matrix
    Given an n x n matrix, where every row and column is sorted in increasing order. Given a key, write a program finding whether this key is in the matrix.

    Перевод
    Дана матрица NxN, где каждая строка и столбец отсортированы по возрастанию. Дано ключевое значение. Напишите программу для определения, где в матрице находится это ключевое значение.


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

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


  1. gotoxy
    17.04.2018 15:50
    +1

    Про пиратов: 61.
    2 * 3 * 4 * 5 * 6 + 1.
    Сокращаем лишние простые множители, остаются 3 * 4 * 5 + 1


    1. Snusmumrick97
      17.04.2018 16:07
      +1

      Лишь когда они разбудили седьмого пирата, им удалось разделить все камни без остатка.
      , а 61 не делится на 7. Правильный ответ — 301


      1. kwasar
        17.04.2018 21:38

        складываем на калькуляторе 7+7+7+… и отсекаем все результаты, которые делятся на 2, 3, 4, 5, 6 (это несложно).
        у меня получилось 91


        1. Rsa97
          17.04.2018 21:46
          +1

          91%4 = 3 ? 1


          1. kwasar
            18.04.2018 21:53

            верно.
            Пересчитал, действительно 301 правильный ответ.


  1. urtow
    17.04.2018 16:02

    Про монеты — 75%


  1. yar3333
    17.04.2018 16:42

    Про пиратов — 7*7 = 49 (нам нужен множитель к семёрке, но не ниже 7-ки же, т.к. мы знаем, что результат не делился на [2..6]).

    Про монеты — 50/50. По сути у нас спросили является ли монета поддельной.


    1. Snusmumrick97
      17.04.2018 16:59

      Остаток от деления 49 на 5 — 4, а у нас по условию всегда остаётся лишней только 1 монета


      1. yar3333
        17.04.2018 17:01

        Чёрт, правда :)


    1. Nikles
      17.04.2018 17:46

      1. Не подходит, так как когда их было 5 у них остался 1! камень, а при 49 осталось бы 4.


    1. vmt88
      17.04.2018 17:46

      49 не соответствует условию 5n+1
      С вероятностью 0,5 согласен, но считаю что надо смотреть с точки зрения условной вероятности.
      Р(2-я решка)= P(фальшивая монета)*Р(решка на фальшивой монете) = 0.5*1=0.5


    1. Rsa97
      17.04.2018 20:35

      А какова, по вашему, будет вероятность того, что внизу решка, если сверху орёл? Тоже 50%? Ведь по сути это вопрос о том, является ли монета настоящей…


      1. yar3333
        17.04.2018 21:00

        Думаю, что если взять высказывание и поменять в нём несколько слов на противоположные, истинность полученного высказывания не обязана совпадать с истинностью исходного :)


    1. yar3333
      18.04.2018 10:33

      Про монеты: был неправ. Ответ: 2/3. jsfiddle.net/shdqse5z/6


      1. tashihu
        18.04.2018 15:52

        С вероятностями проще расматривать все варианты. У нас 4 варинта событий.2 монеты по 2 стороны. 1 орел к верху, 1 решка к верху, 2 решка(А) к верху, 2 решка(Б) к верху. 1 случай не подходит. В оставшихся 3 вариантах снизу 1 орел и 2 решки. 2/3


        1. urtow
          18.04.2018 16:00

          Спасибо.
          Я все так и подумал, но не учел, что один вариант надо исключить — результат уже известен.


  1. sshmakov
    17.04.2018 17:36

    Если target = 14 и k = 3, тогда выход должен быть “4 20”.

    Разве не 12 и 20?


    1. reci Автор
      17.04.2018 17:54

      Вы правы, при форматировании одна ветвь была помещена не туда. При таком расположении должно быть 12, 20.


  1. zagnit
    17.04.2018 17:48

    Разве не 7 камней у пиратов?)


    1. yar3333
      17.04.2018 17:55

      Остаток от деления на 4 не равен 1 для 7.


  1. morsic
    17.04.2018 18:20
    +2

    Про пиратов — 2/3.


    1. morsic
      17.04.2018 19:33

      Про монеты*


  1. Rsa97
    17.04.2018 20:08
    +3

    Вопрос 1
    Поскольку для 2, 3, 4, 5 и 6 пиратов оставался один камень, то значит необходимо найти число вида НОК(2, 3, 4, 5, 6)*n+1 = 60*n+1, нацело делящееся на 7.
    Признак делимости на 7 — число без последней цифры минус удвоенная последняя цифра делится на 7. Последняя цифра всегда 1, получаем что 6*n-2 должно делиться на 7. Ближайшее n = 5, значит число камней 60*5+1 = 301.


  1. r3star
    17.04.2018 22:31

    про камни и пиратов у меня получилось 189 хз почему =)

    про монеты 50% шанс )


  1. mbait
    18.04.2018 06:52

    От задач по терверу нужно отказаться, как когда-то отказались от логических задач, потому что ответ может меняться значительно от положения фразы "какова вероятность, что" в постановке задачи. В данном случае ответ 50%, потому что монеты всего две, выбираются они равновероятно, а значит две решки появятся только в половине случаев. Но вот если спросить иначе: какова вероятность, что после случайного выбора и подбрасывания будет решка с обоих сторон, от ответ уже получится другой.


    1. mbait
      18.04.2018 06:56

      В последнем предложении написал ерунду, но мысль должна быть понятна — переформулировав задачу, можно получить правильный ответ, отличный от "50%".


      1. Dr_Dash
        18.04.2018 07:06

        Вы берёте случайную моннту. Какова вероятность что после 2х подбрасываний случайно выбранной монеты выпадет решка. как-то так


    1. mbait
      18.04.2018 07:12

      Всё зависит от того, из чего формируется множество элементарных исходов. Допустим, мы равновероятно выбираем монету. Если после подбрасывания выпал орёл, то такой исход мы не считаем, а во всех остальных — считаем. Тогда у "неправильной" монеты больше шансов попасть в выборку, а значит и шанс получить решку после переворота не 50%. Но если нам ничего не известно про возможные выпадения орла, то всё таки шанс остаётся 50%.


    1. Rsa97
      18.04.2018 08:11

      Здесь в задаче два выбора — равновероятный выбор одной из двух монет и равновероятный выбор положения монеты. Они дают нам четыре равновероятных исхода. Один из этих исходов (настоящая монета орлом вверх) отсеивается условием. Остаётся три, из них только два с решкой внизу. 2/3.


  1. Dr_Dash
    18.04.2018 06:58
    +1

    Пираты —
    Ещё Евклид считал очевидным, что с помощью умножения только простых чисел можно получить все натуральные числа, причем каждое натуральное число представимо в виде произведения простых чисел единственным образом. Поэтому искомое число камней состоит из числа 7(НОД) и ещё какого-то числа Dimonds_X
    При этом Dimonds_X не делится ни на 2 ни на 3 ни 5. То есть оно состоит из простых чисел >= 7. Фактически поиск таких чисел это задача факторизации, т.е. требуется пробовать и проверять. Поскольку нужно минимальное, предположим что оно состоит из 1 простого сомножителя. И оно будет минимально до тех пор, пока искомый простой сомножитель не превысит 47 ( максимальное простое число меньшее чем 7*7 = 49, а это в свою очередь минимальное число состоящее их 2х простых чисел, которые оба >=7, напомню, что числа с 2 по 5 не подходят)
    Перебираем простые числа от 7 до 47 и проверяем на калькуляторе.
    Суть проверки, поскольку у тех ребят всё время оставался один камень, то 7*Dimonds_X — 1 должно делиться на 2(дважды) 3 и 5. Поскольку числа кратные 5 будут встречаться реже(их просто меньше) пусть это будет первый маркер.
    7*7 -> 48 fail
    7*11-1 -> 76 fail
    7*13-1 -> 90 win? нет fail потому что не делится на 4.
    Перебирая подобным незамысловатым способом остальне простые числа в диапазоне 7 до 47
    неожиданно наткнулся на сундук с пиастрами на число 43. 43*7-1 -> 300 то есть общее число камней которое полностью удовлетворяет условию задачи 301


    1. BarabashkaS
      18.04.2018 13:33
      +1

      перебор можно было упростить, если заметить, что остаток от деления на 5 дает 1, а значит число должно заканчиваться на 1 (6-ку естественно отбрасываем), а значит число, на которое нужно умножить 7 должно оканчиваться на 3, тогда в перебор войдут только числа 13, 23 и 43


    1. leshabirukov
      18.04.2018 15:15

      Можно проще: чтобы выполнить первое условие, необходимо
      Х % НОК(2,3,4,5,6) == 1 (%-остаток от деления, НОК(2,3,4,5,6)==60)
      итого Х = 60n +1.
      Заметив, что 60 % 7 = 4, ищем число вида
      4+4+...+4+1 = 7n
      А найдя, заменяем все 4+4+… на 60+60+..., и получаем 301


  1. Dr_Dash
    18.04.2018 07:26

    Монета — ответ 50% неверный.
    Такой вариант не учитывает того, что мы уже произвели одно испытание и имеем некоторую информацию на этот счёт и в то же время наши знания на этот счёт ограничены. О чём я?

    Всего у нас имеется 4 стороны монет(2 одной и 2 другой), для ясности проименуем их
    a b c d/ из них a орёл, а остальные решки.
    после испытания мы видим одну из b c d но не знаем которая из них. И нет никаких запретов на то, чтобы на противоположной стороне оказалась a либо две любые из b c d
    иными словами, образно выражаясь, в мешке есть один орёл и две решки с равной вероятностью. Следовательно, вероятность того что на той стороне тоже решка — 2/3


    1. Funix
      18.04.2018 13:33

      Как раз-таки 50% — верный ответ.
      Раз уж мы уже видим решку, то варианта возможно только 2 (и вероятность у них одинаковая): выбранная монета или «настоящая» или фальшивая. И этим определяется содержимое обратной стороны (т.е. 50/50). Если бы речь шла о нескольких случаях бросания монет и вероятностях тех или иных событий, то определенно вероятности могли бы быть иными. Но для отдельного определенного случая с фактическим раскладом «решка» вверху — есть только два (равнозначных) варианта.


      1. Rsa97
        18.04.2018 15:53

        Нет, мы видим либо первую решку фальшивой монеты, либо вторую её решку, либо решку настоящей монеты.


        1. bogotoff
          19.04.2018 20:38

          Всего вариантов может быть 2, т.к. монет только 2. Либо окажется что это правильная монета, либо фальшивая. Если вариантов исхода 2 то и ответ 1/2.


          1. Rsa97
            19.04.2018 23:32

            Вы забыли, что кроме выбора монет было и второе действие — выбор стороны.


            1. bogotoff
              20.04.2018 02:06

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


              1. Rsa97
                20.04.2018 07:04

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


                1. bogotoff
                  20.04.2018 14:34

                  Я понял Вашу мысль :)
                  Но мне все-таки кажется, что независимо от того какая именно сторона выпала в случае с фальшивой монетой, это не влияет на исход, т.е. не важно для нас.
                  Давайте подождем ответы от автора статьи. Думаю кто-то из нас сильно удивиться :)


                1. bogotoff
                  20.04.2018 15:13

                  Думаю я оказался не прав)
                  Я решил практическим путем проверить и накидал код: cpp.sh/8ibyj
                  У меня получается 1/3 в ответе. Я где-то допустил ошибку?


  1. Detlev
    18.04.2018 13:33
    +1

    Вторая задача = 2/3. Классическая задача на теорему Байеса.


    1. andyudol
      18.04.2018 15:43

      Байес вас бы в угол поставил.
      Выбирается монета. Одна из двух. Решка вверху по условию задачи. Всё, выбора больше нет.


      1. Detlev
        18.04.2018 19:22

        События H1 и H2 — соответственно выбор первой и второй монеты. Их вероятности(априорные) P(H1) и P(Н2) по условию равны 0,5. Событие A — появление решка. Условные вероятности события A равны P(A/Н1) = 1(если выбрана первая монета) и P(A/Н2) = 0,5(если выбрана вторая монета). Событие А произошло, необходимо пересчитать априорную вероятность выбора первой монеты. По формуле Байеса находим = 0,5 * 1 / (0,5 * 1 + 0,5 * 0,5) = 0,67 (или 2/3)
        Байес в чистом виде)) в одно действие


        1. andyudol
          19.04.2018 19:26

          Даже не близко. Решка вверху — это условие задачи, заданное ещё до того, как я выбрал монету. Если я выбрал качественную монету, то обратная сторона гарантированно не решка. Если выбрал бракованную — обратная сторона гарантированно тоже решка.


          1. Detlev
            19.04.2018 20:53

            Неправильно. Задача не в том, чтобы найти вероятность выпадение решки. А именно найти вероятность, что выбранная монета неправильная!!! При условии что мы видим решку. Повторюсь, это чисто Байесовская схема и постановка задачи. Т.е. сначала выбор монеты(гипотезы), потом результат(событие) и по результату пересчитать вероятность гипотезы.


            1. Detlev
              19.04.2018 21:58

              Уточню. Задача не в том, чтобы найти вероятность выпадение первой решки.


            1. Detlev
              20.04.2018 10:52

              Чтобы понять суть вышесказанного, попробуйте решить немного усложненный вариант этой задачи. У вас на столе N правильных монет и M неправильных монет. Наугад, с закрытыми глазами выбираете одну. Подбрасываете ее K раз, и ровно K раз выпадает решка. Найти вероятность, что и в K+1 раз тоже выпадет решка.


  1. neobuh
    18.04.2018 13:33

    Про камни — условие делится на пять с остатком 1 соотв. только числа с окончанием на 6 (не подходит т.к. четное и 1), смотрим числа с 1 которые делятся на 7 = 21 + 7*10*nб если еще учесть остаток о деления на 3, то = 91 + 7*3*10*n, первое число такое 301

    Про монеты вероятность выкинуть правильную монету решкой вверх = 25%, для неправильной 50%, т.о. вероятность при перевороте получить решку = 2/3


  1. AndreyZabolotny
    18.04.2018 13:33
    +1

    Задача 1
    for (int i = 0; i<1000; i++)
    {
    if (i%2==1&&i%3==1&&i%4==1&&i%5==1&&i%6==1&&i%7==0&&)
    {
    cout<<«Значение i»<<i;
    }
    }
    ответ 301


    1. tashihu
      19.04.2018 11:38

      по Задача 1. Прямой перебор достаточно долго выполняется, с 6 операциями деления в if. Подвести бы сюда математические выкладки и пропустить заведомо ложные варианты.
      If ( ( 60 * i + 1) % 7 == 0 )


  1. Ravaldini
    18.04.2018 17:03

    Монеты
    Мы имеем всего два варианта на старте:
    1) Выпала монета орел-решка.
    2) Выпала монета решка-решка.
    Верхнюю решку можно не считать — это уже данность.
    Таким образом, вероятность того что это монета решка-решка 50%.

    Если добавить в условия еще одну монету решка-решка:
    1) Выпала монета орел-решка.
    2) Выпала монета1 решка-решка.
    3) Выпала монета2 решка-решка.
    Вот так уже вероятность обнаружения решки будет 2/3.
    В двух случаях из трех мы найдем под решкой еще одну решку.

    Иными словами, условие что мы на старте уже видим решку исключает ее из нашего расчета вероятности. Это уже свершившийся факт и нужно считать только те варианты, которые могут быть на скрытой стороне монеты.


  1. CakeOfChaos
    19.04.2018 16:23

    В условиях задачи 1 указано неверное бинарное дерево

     
                                  20
                                 /                               8    22
                              /                           4      12
                          /                       10    14
    

    10 > 8, но при этом находится слева от узла 8.


    1. reci Автор
      19.04.2018 16:28

      Спасибо, принято.


  1. Projack
    19.04.2018 17:09

    Первое: берем условно-рандомное число, чтобы понять, что к чему.
    Выбираем 49 из логики, что множитель больше 6. При переборе получаем, что не подходит 5. Наводит на мысль, что это число имеет форму или *6 или *1, чтобы удовлетворить 5. Отсекаем вариант с *6, потому что оно будет кратно 2.
    Имеем, что число должно быть в формате *1. В силу того, что при умножении 7 на числа [0..9] только один вариант дает на конце единицу (7*3=21). Перебираем множители: n*10+3.
    7*13 = 91 [91 % 4 = 3]
    7*23 = 161 [161 % 3 = 2]
    7*33 = 231 [число 33 само по себе делится на 3]
    7*43 = 301 — бинго.
    Ответ: 301.