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

КДПВ

Ниже приведены вопросы и задачи для соискателей на должность инженера-разработчика в Amazon, сложность традиционно варьируется от низкой до высокой. А некоторые вопросы под силу решить только самым пытливым умам :) Предлагаем решить их и тем, кто готовится к собеседованию в компанию подобного уровня и просто для проверки собственных сил.

Вопросы


  1. Find missing int
    We are given an Excel sheet which contains integers from 1 to 50, including both. However, the numbers are in a jumbled form and there is 1 integer missing. You have to identify the missing integer. Only the logic is required.

    Перевод
    Дана таблица Excel, содержащая числа от 1 до 50 включительно. Числа неупорядочены, а одно число — пропущено. Необходимо найти это число. Для решения задачи достаточно логики.

  2. Robots and parachutes
    Two robots land with their parachutes on an infinite one-dimensional number line. They both release their parachutes as soon as they land and start moving. They are allowed only to make use of the following functions.

    I. moveLeft() // robot moves to left by 1 unit in 1 unit time

    II. moveRight() // robot moves to right by 1 unit in 1 unit time

    III. noOperation() // robot does not move and takes 1 unit time

    IV. onTopOfParachute() // returns true if the robot is standing on top of either of the parachute, else false

    V. didWeMeet() // returns true if the robot meets to the other robot, else false

    Write a function in order to make the robots meet each other. Robots will be executing the same copy of this function. Pseudocode is accepted.

    Перевод
    Два робота с парашютами приземляются на бесконечную плоскую ленту. Оба отстёгивают парашюты и начинают двигаться. Роботы могут выполнять следующие инструкции:

    I. moveLeft() // робот двигается влево на 1 единицу за 1 единицу времени

    II. moveRight() // робот двигается вправо на 1 единицу за 1 единицу времени

    III. noOperation() // робот выжидает на месте 1 единицу времени

    IV. onTopOfParachute() // возвращает true если робот стоит на парашюте, иначе — возвращает false

    V. didWeMeet() // возвращает true, если робот встретил другого робота, иначе — false.

    Напишите функцию, обеспечивающую встречу роботов. Роботы выполняют одинаковые копии этой функции. Псевдокод приемлем.

Задачи


  1. Run length encoding
    Given an input string, write a function that returns the Run Length Encoded string for the input string.

    For example, if the input string is “wwwwaaadexxxxxx”, then the function should return “w4a3d1e1x6”.
    Перевод
    Дана входная строка, напишите функцию, которая возвращает кодирование длин серий входной строки.

    Например, входная строка “wwwwaaadexxxxxx” должна быть преобразована к “w4a3d1e1x6”.

  2. Students and chocolates
    Given n boxes containing some chocolates arranged in a row. There are k number of students. The problem is to distribute maximum number of chocolates equally among k students by selecting a consecutive sequence of boxes from the given lot. Consider the boxes are arranged in a row with numbers from 1 to n from left to right. We have to select a group of boxes which are in consecutive order that could provide maximum number of chocolates equally to all the k students. An array arr[] is given representing the row arrangement of the boxes and arr[i] represents number of chocolates in that box at position ‘i’.

    Examples:

    Input: arr[] = {2, 7, 6, 1, 4, 5}, k = 3
    Output: 6
    The subarray is {7, 6, 1, 4} with sum 18.
    Equal distribution of 18 chocolates among
    3 students is 6.
    Note that the selected boxes are in consecutive order
    with indexes {1, 2, 3, 4}.
    Перевод
    Дано n ящиков с шоколадом, уложенных в ряд. Также присутствует k студентов. Задача — разделить максимально возможное количество шоколада поровну между студентами, выбрав подпоследовательность ящиков в ряду. Предположим, ящики пронумерованы от 1 до n слева направо. Мы должны последовательно выбрать группу ящиков, расположенных рядом, которые содержат максимальное количество шоколада, делимого поровну между студентами. Массив arr[] представляет собой ящики, расположенные в ряд, а значение arr[i] представляет количество шоколада в ящике 'i'.

    Например:

    Вход: arr[] = {2, 7, 6, 1, 4, 5}, k = 3
    Выход: 6 (количество шоколада, которое достанется одному студенту)
    Подмассив {7, 6, 1, 4} с суммой 18. Распределение 18 шоколадок между студентами даст 6 шок/чел. Выбранные индексы ящиков — {1, 2, 3, 4}.

  3. Print all anagrams together
    Given an array of words, print all anagrams together. For example, if the given array is {“cat”, “dog”, “tac”, “god”, “act”}, then output may be “cat tac act dog god”.
    Перевод
    Дан массив слов, напечатайте все анаграммы вместе. Например, в массиве {“cat”, “dog”, “tac”, “god”, “act”} вывод может быть «cat tac act dog god».


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

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


  1. Rsa97
    25.04.2018 16:22
    +1

    Вопрос 1
    Пропущенное_число = (1 + 50) / 2 * 50 — Сумма_чисел_в_таблице


    1. Detlev
      25.04.2018 22:17

      И встретятся они через 4*s единиц времени, где s — расстояние между парашютистами сразу после приземления.


    1. reci Автор
      25.04.2018 22:19
      -1

      Оба будут двигаться влево бесконечно.


      1. reci Автор
        25.04.2018 22:41

        Хотя, если парашюты остаются на месте приземления (а они остаются по условию задачи), то — все ок.


  1. trantor1
    25.04.2018 17:16
    +1

    а так не проще?

    #1
    Сумма_чисел_от_1_до_50 — Сумма_чисел_в_таблице


    1. Mikluho
      25.04.2018 17:57
      +1

      ну так выше же и дана формула суммы ряда.


  1. IIvana
    25.04.2018 23:53

    1 вопрос — Гаусс, Карл! (С). Который решал ее в детстве безо всяких экселей.


    1 задача
    f = (=<<) (\s -> head s : show (length s)) . group


  1. andyudol
    26.04.2018 09:14

    1 вопр. В екселе это номер строки, начиная с которой номер строки не равен числу.


    1. Rsa97
      26.04.2018 09:20

      Это только если числа отсортированы, находятся в одной колонке и записаны начиная с первой строки. В задаче же, как минимум, явно указано, что числа неупорядочены.


      1. andyudol
        26.04.2018 14:32

        Разьве в екселе нет сортировки?


        1. Rsa97
          26.04.2018 15:28

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


          1. andyudol
            26.04.2018 16:01

            Но ведь при вычислении через разность сумм их ведь тоже не ручками предлагается переносить?


            1. Rsa97
              26.04.2018 16:10

              Для суммирования можно просто выделять диапазоны ячеек, в том числе и на разных страницах.


              1. andyudol
                27.04.2018 09:32

                Почему в одном случае можно, а в другом нельзя?


                1. Rsa97
                  27.04.2018 12:13

                  Попробуйте сами. Выделите в Excel несколько колонок на разных страницах и попробуйте их отсортировать для сравнения с номерами строк.


                  1. andyudol
                    27.04.2018 14:42

                    Почему в моём случае это сложно, а в вашем — посто?


                    1. Rsa97
                      27.04.2018 15:45

                      Вы не спрашивайте, вы откройте Excel и попробуйте. Запишите в колонку A все нечётные от 1 до 49, в колонку B — все чётные от 2 до 50. А теперь отсортируйте эти значения так, чтобы они были в строках с соответствующими номерами.


                      1. andyudol
                        28.04.2018 07:33

                        Ещё раз. Почему в поём случае это проблема, а в вашем — нет? Вы как будете вычислят пропущенное число? Макрос напишете или на калькуляторе? Эти числа ведь не сами найдутся и впрыгнут в калькулятр. В любом случае вам точно так же придётся эти числа найти, выделить, скопировать, куда-то вставить. Подозреваю, что у меня-то как раз ручных действий требуется меньше.


                        1. Rsa97
                          28.04.2018 07:57

                          Ставите курсор в свободную ячейку. Набираете '=(1+50)/2*50-СУММ('. Зажав Ctrl, мышкой выбираете все нужные ячейки и/или диапазоны ячеек. Набираете ')'. Нажимаете Enter. Всё, пропущенное число найдено. Ничего копировать, вставлять и т.п. не надо.


                          1. andyudol
                            28.04.2018 09:23

                            То есть все те же действия ручками совершить надо.

                            Ну ладно, что-то трёп затянулся. Я же не опровергаю вычислительное решение.

                            Ну и на закуску. "… одно число — пропущено. Необходимо найти это число.". Найти, а не вычислить! Но как можно найти то, чего нет? Оно же пропущено!

                            Вот. Вы как хотите, а я на этом закончил.


                            1. Detlev
                              28.04.2018 11:35

                              На мой взгляд не совсем корректно поставлена задача. Непонятно зачем приплели Excel. В Excel можно решить эту задачу большим количеством способов, вплоть до того что можно написать макрос. Я бы переформулировал бы задачу так. Дан массив размерностью 49, в котором находятся в неупорядоченном виде числа от 1 до 50, за исключением одного. Как за один проход найти пропущенное число? Ограничение по памяти О(1). И тогда решение от Rsa97 станет очевидным и самым простым.


                              1. Detlev
                                28.04.2018 12:04

                                Или даже так: вообще не использовать дополнительно память))


                1. reci Автор
                  27.04.2018 12:26

                  Я думаю, что Rsa97 имеет в виду, что-то вроде
                  SUM(Sheet1!A1:C10,Sheet2!A1:C10)


                  1. andyudol
                    27.04.2018 14:48

                    А Sheet1!A1:C10 и Sheet2!A1:C10 точно в одной таблице находятся?


                    1. Rsa97
                      27.04.2018 15:44

                      По условию задачи — в одной.


                      1. andyudol
                        28.04.2018 07:35

                        Я читал условия задачи.
                        В екселе разные листы — это точно одна и та же таблица?


  1. jmdorian
    26.04.2018 10:00

    Мой вариант #2
    steps = 1;
    do {
    for (i=0;i < steps; i++) { moveLeft(); }
    if (onTopOfParachute()) { noOperation(); }
    else {
    for (i=0;i < steps; i++) { moveRight();}
    steps++;
    }
    } while(!didWeMeet())


    1. Rsa97
      26.04.2018 10:10

      Встретятся через s2 единиц времени, где s — расстояние между парашютистами сразу после приземления.


      1. Rsa97
        26.04.2018 10:24

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


        1. zalp
          26.04.2018 11:19

          image


        1. jmdorian
          26.04.2018 13:43

          Да, облажался.


  1. Vlad130198
    26.04.2018 17:05

    Моё решение для вопроса 2
    bool checkParachute = false;
    do {
        moveLeft();
        if (checkParachute)
    	moveLeft();
        else
    	noOperation();
        if (onTopOfParachute())
    	checkParachute = true;		
    } while (!didWeMeet());
    


  1. ilya06
    26.04.2018 19:28

    Такой вариант задачи:

    Задача 1
    public static string ConvertIntoSeriesLengths(string str)
            {
                if (str == string.Empty)
                    return "Empty string passed";
    
                int len = 1;
                char symb = str.ToCharArray()[0];
                string res = String.Empty;
    
                for (int i = 1; i < str.ToCharArray().Length; i++)
                {
                    if (str.ToCharArray()[i] == symb)
                    {
                        len++;
                    }
                    else
                    {
                        res += symb.ToString() + len.ToString();
                        len = 1;
                        symb = str.ToCharArray()[i];
                    }
                }
                
                return res += symb.ToString() + len.ToString();
            }
    


  1. Rsa97
    26.04.2018 20:25

    Задача 1
    public static string ConvertIntoSeriesLengths(string str) {
      var chars = str.ToCharArray();
      if  (0 == chars.Length) {
        return String.Empty;
      }
      int len, pos = 0;
      char ch;
      string res = String.Empty;
      while (pos < chars.Length) {
        len = 1;
        ch = chars[pos++];
        while (pos < chars.Length && ch == chars[pos]) {
          pos++;
          len++;
        }
        res += ch.toString() + len.toString();
      }
      return res;
    }