Разговаривал с коллегой, и вот задал он такую задачку:
Я решил ее двумя способами:
Очевидно что у каждого способа есть свои плюсы и минусы. Первый вариант не требует дополнительных трат памяти, т.к. работает напрямую с входящим массивом. Однако если данных много, а искомые значения в конце массива (худший случай), то алгоритм будет работать достаточно медленно. Т.е. скорость его работы не линейная и зависит от того, в каком месте массива находятся данные. Второй напротив, работает с линейно скоростью (ну или почти). Не зависимо где находятся данные, их поиск будет всегда занимать одинаковое время. Однако он потребляет в два раза больше памяти и требует время на ее распределение в map.Вывод напрашивается сам собой: нет универсального решения. Алгоритм зависит от задачи.
Это язык golang. Там функция может возвращать больше одного значения. Хоть 5, но на практике я больше трех не видел. А вообще это офигенно удобно. Хотя конечно я мог и просто массив вернуть.
В этом языке много "синтаксического сахара". Посмотрите на это: if idx, ok := m[c]; ok && idx != i { idx, ok := m[c] - это так поиск в map происходит. Если значение будет найдено, то ok = true, а idx будет содержать значение. Причем все это происходит в рамках if. Т.е. объявляются переменные (:= это объявление с присваиванием), вызывается функция и проверяется условие. Переменные будут видны только в этом if.
Не то что бы конкретно эта функция имела какой то практический смысл, это скорее задача на способность мыслить. Тест который дают на собеседованиях. Но вообще конечно ее можно использовать для каких то задач. Ну например где нибудь в системе бронирования билетов. Человеку нужно слетать из пункта А, в пункт Б и обратно. У него есть N рублей на все. Тогда входной массив это цены на билеты по дням года. Нужно подобрать даты вылета, что бы уложится в эту сумму. Вот такая функция может помочь, подсказать.
Мы используем cookie-файлы, чтобы улучшить сервисы для вас. Если ваш возраст менее 13 лет, настроить cookie-файлы должен ваш законный представитель. Больше информации
Комментарии 6
Хотя конечно я мог и просто массив вернуть.
if idx, ok := m[c]; ok && idx != i {
idx, ok := m[c] - это так поиск в map происходит. Если значение будет найдено, то ok = true, а idx будет содержать значение. Причем все это происходит в рамках if. Т.е. объявляются переменные (:= это объявление с присваиванием), вызывается функция и проверяется условие. Переменные будут видны только в этом if.