当前位置: 面试刷题>> 子域名访问计数 (经典算法题500道)


题目描述

题目:子域名访问计数

假设你有一个网站,其URL由多个子域名和主域名组成,例如:"www.example.com" 和 "mail.example.com"。为了分析网站流量,你需要编写一个程序来计算并返回每个子域名(包括顶级域名)的访问次数。子域名由点(".")分隔,并且每个子域名都是唯一的,不考虑大小写。

输入数据将是一系列的URL字符串,每个URL代表一次访问。输出应该是一个映射(或字典),其中键是子域名(包括顶级域名),值是相应的访问次数。

示例

输入:

["www.example.com", "mail.example.com", "developers.mail.example.com", "www.example.com"]

输出:

{"example.com": 3, "mail.example.com": 2, "www.example.com": 2, "developers.mail.example.com": 1}

注意

  • 访问次数统计时,应包含所有子域名(包括顶级域名)的访问次数。
  • 输出的映射(或字典)中,键应为小写形式,以保持一致性和简化处理。

PHP 示例代码

function subdomainVisits($cpdomains) {
    $counts = [];
    
    foreach ($cpdomains as $domain) {
        $parts = explode('.', strtolower($domain));
        $length = count($parts);
        
        // 从最顶层域名开始计数,直到当前域名
        for ($i = $length - 1; $i >= 0; $i--) {
            $subdomain = implode('.', array_slice($parts, $i));
            if (!isset($counts[$subdomain])) {
                $counts[$subdomain] = 0;
            }
            $counts[$subdomain]++;
        }
    }
    
    return $counts;
}

// 示例用法
$domains = ["www.example.com", "mail.example.com", "developers.mail.example.com", "www.example.com"];
$result = subdomainVisits($domains);
print_r($result);

Python 示例代码

def subdomainVisits(cpdomains):
    counts = {}
    
    for domain in cpdomains:
        parts = domain.lower().split('.')
        length = len(parts)
        
        # 从后往前遍历,构建所有子域名
        for i in range(length - 1, -1, -1):
            subdomain = '.'.join(parts[i:])
            if subdomain not in counts:
                counts[subdomain] = 0
            counts[subdomain] += 1
    
    return counts

# 示例用法
domains = ["www.example.com", "mail.example.com", "developers.mail.example.com", "www.example.com"]
result = subdomainVisits(domains)
print(result)

JavaScript 示例代码

function subdomainVisits(cpdomains) {
    let counts = {};
    
    cpdomains.forEach(domain => {
        let parts = domain.toLowerCase().split('.');
        let length = parts.length;
        
        // 从后往前遍历,累加所有子域名的计数
        for (let i = length - 1; i >= 0; i--) {
            let subdomain = parts.slice(i).join('.');
            if (!counts[subdomain]) {
                counts[subdomain] = 0;
            }
            counts[subdomain]++;
        }
    });
    
    return counts;
}

// 示例用法
const domains = ["www.example.com", "mail.example.com", "developers.mail.example.com", "www.example.com"];
const result = subdomainVisits(domains);
console.log(result);

以上代码均实现了题目要求的功能,并通过示例用法进行了验证。在码小课网站上发布此类内容,可以帮助更多学习者理解和应用这些算法。

推荐面试题