Задача с собеседования в Amazon

Другое 28.10.2025 · 👁 9 200 просмотров
Задача с собеседования в Amazon Реализовать структуру данных MapSum, которая поддерживает две операции: - insert(key, val) — вставить пару ключ-значение (или обновить значение, если ключ существует), key - строка, val - целое число - sum(prefix) — вернуть сумму всех значений, ключи которых начинаются с заданного префикса Пример: mapSum.insert("apple", 3) mapSum.sum("ap") // return 3 mapSum.insert("app", 2) mapSum.sum("ap") // return 5 (apple + app = 3 + 2) Работать должно линейно по времени Наш чат алгоритмистов Решение: Будем использовать бор - префиксное дерево, где каждый узел хранит сумму всех значений с данным префиксом: 1. При вставке ключа вычисляем дельту (разницу между новым и старым значением) 2. Проходим по дереву вдоль символов ключа, создавая узлы при необходимости 3. В каждом узле увеличиваем значение на дельту 4. При запросе суммы просто идём по дереву до конца префикса и возвращаем значение узла Дельта нужна для корректной обработки обновлений: если apple было 3, а стало 7, то во все узлы пути добавляем +4. Это даёт O(k) по времени для обеих операций (где k — длина ключа/префикса) и O(n × k) по памяти (где n — количество ключей). class TrieNode: def init (self): self.children = {} self.value = 0 class MapSum: def init (self): self.root = TrieNode() self.map = {} # Храним текущие значения для обработки обновлений def insert(self, key: str, val: int) -> None: delta = val - self.map.get(key, 0) self.map [key] = val node = self.root for char in key: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] node.value += delta def sum(self, prefix: str) -> int: node = self.root for char in prefix: if char not in node.children: return 0 node = node.children[char] return node.value Можно использовать просто словарь и при каждом sum() перебирать все ключи с помощью startswith() . Это даст O(1) для insert и O(n) для sum, что проще в реализации, но менее эффективно при частых запросах сумм. @algoses
Откликнуться в Telegram →

⚠️ Никогда не платите «за оформление» или «гарантию трудоустройства» — это признак мошенников. Работа ТРУ не несёт ответственности за содержание вакансии.

🇮🇱 Не нашли подходящую зарплату? В Израиле платят от $3000 Без языка и опыта · жильё и легализация под ключ · официально Смотреть вакансии →