Подсчёт посещений субдоменов

Для каждой записи добавьте счётчик ко всем суффиксам домена, разделённым точками. Накопленные значения преобразуйте обратно в строки.

Короткий ответ

Что ответить на собеседовании

Для каждой записи добавьте счётчик ко всем суффиксам домена, разделённым точками. Накопленные значения преобразуйте обратно в строки.

Подробный разбор

Ответ с пояснениями

Условие

Имя веб‑сайта, например "discuss.leetcode.com", состоит из нескольких уровней доменов. Самый верхний уровень — это "com", следующий — "leetcode.com", а самый нижний — "discuss.leetcode.com". При обращении к полному домену, например к "discuss.leetcode.com", автоматически считается, что были посещены и его родительские домены "leetcode.com" и "com".

Запись с подсчётом посещений имеет один из двух форматов: "cnt d1.d2.d3" или "cnt d1.d2", где cnt — количество обращений, а d1.d2.d3 — само доменное имя.

К примеру, строка "9001 discuss.leetcode.com" означает, что домен discuss.leetcode.com был открыт 9001 раз.

Дан массив строк domainsList, каждая из которых содержит запись с подсчётом посещений. Необходимо вернуть массив строк, где каждая строка отражает суммарное количество посещений для каждого субдомена, встречающегося во входных данных. Порядок строк в ответе не важен.

Example 1: Input: domainsList = ["9001 discuss.leetcode.com"] Output: ["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"] Explanation: В входных данных присутствует единственный домен "discuss.leetcode.com". Как было описано выше, его субдомены "leetcode.com" и "com" также считаются посещёнными, поэтому каждый из них получает тот же счёт 9001.

Example 2: Input: domainsList = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"] Output: ["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"] Explanation: Мы посещаем "google.mail.com" 900 раз, "yahoo.com" 50 раз, "intel.mail.com" один раз и "wiki.org" 5 раз. Для субдоменов получаем: "mail.com" — 900 + 1 = 901, "com" — 900 + 50 + 1 = 951, "org" — 5.

Ответ

Для каждой записи добавьте счётчик ко всем суффиксам домена, разделённым точками. Накопленные значения преобразуйте обратно в строки.

from collections import Counter

def subdomain_visits(domainsList):
    counts = Counter()
    for record in domainsList:
        count_text, domain = record.split()
        count = int(count_text)
        if count < 0:
            raise ValueError('Отрицательное число посещений')
        parts = domain.split('.')
        for index in range(len(parts)):
            counts['.'.join(parts[index:])] += count
    return [f'{count} {domain}' for domain, count in counts.items()]

Для discuss.leetcode.com учитываются три суффикса. Это правило учебной агрегации, а не утверждение, что браузер реально отправил отдельные запросы ко всем родительским доменам. Порядок результата не важен. Корректность доменных имён предполагается проверенной на входе.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее