Блог пользователя goo.gl_SsAhv

Автор goo.gl_SsAhv, 12 лет назад, По-русски

Навеяно вот этим постом, про поиск неповторяющихся элементов. Приведу две задачки типа для собеседований.

  1. Даны два списка цифр (от 0 до 9) которые представляют собой запись длинных чисел, например список 3 -> 2 -> 6 -> 7 -> 8 это число 32678. Требуется сложить два этих числа используя O(1) дополнительной памяти. По спискам мы можем перемещаться только вперед, по спискам можно проходить несколько раз.
    Заметим что никакие хаки не позволяют нам двигаться по спискам в обратном направлении, по условию задачи.

  2. Дан однонаправленный список, где следующий элемент задается его адресом — переменной фиксированной длины, например 8 байтовой. Придумать хак, позволяющий двигаться по списку в обратном направлении. Использовать O(1) памяти. Более подробно опишу что представляет из себя элемент списка на конкретном примере кода

struct TListElement {
    int Val;
    TListElement* Next;
};

PS: Ответы прятать под спойлер (в предыдущую правку)

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

Спойлер.

  • »
    »
    12 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +8 Проголосовать: не нравится

    мы не можем изменять список. нужно использовать его в таком виде, в котором он есть.
    UPD: Это гон, я ошибся

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Я прогнал, ты был прав. можно список изменять.

»
12 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Я правильно понимаю, что 1 — вот эта задача?

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

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

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А что касательно времени?

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    ну подразумевается максимально эффективно. Первая задача решается за O(n). Во второй переход к предыдущему элементу можно делать за O(1).

»
12 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

Вопрос по первой задаче. Можно ли находясь в некоторой элементе списка "поглядеть" значение следующего, но не переходя в него непосредственно.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

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

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

1-я задача. Решение в правке.