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