java解法

数据存储与统计:

使用 TreeMap 存储 URL 及其对应的访问次数,TreeMap 会按键的字典序自动排序,方便管理和检索。
URL 的访问次数通过 getOrDefault 方法更新。
获取访问次数最多的 URL:

使用 PriorityQueue(优先队列)对 TreeMap 的 entrySet 进行排序。
排序规则:
优先按访问次数降序排列。
如果访问次数相同,则按 URL 的字典序升序排列。
最终输出按排序规则选取的前 n 个 URL。
输入处理:

如果输入是数字,调用 getTopN 方法输出结果。
如果输入是 URL,更新 URL 访问次数。
异常处理:

在 isNumeric 方法中捕获非数字输入的异常,确保程序不会因为非法输入而崩溃

import java.util.*;

public class Main {
    // 用 TreeMap 存储 URL 和其访问次数,按字典序自动排序
    static Map<String, Integer> urlCount = new TreeMap<>();
    // 用 PriorityQueue 实现访问次数和字典序的自定义排序
    static PriorityQueue<Map.Entry<String, Integer>> pq;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 循环读取用户输入
        while (sc.hasNextLine()) {
            String input = sc.nextLine();

            // 如果输入是数字
            if (isNumeric(input)) {
                int n = Integer.parseInt(input); // 将输入转换为整数
                System.out.println(getTopN(n)); // 获取访问次数最多的 n 个 URL
            } else {
                // 如果输入是 URL,更新其访问次数
                urlCount.put(input, urlCount.getOrDefault(input, 0) + 1);
            }
        }
    }

    /**
     * 获取访问次数最多的前 n 个 URL
     *
     * @param n 前 n 个 URL
     * @return 按要求排序的前 n 个 URL,使用逗号分隔
     */
    private static String getTopN(int n) {
        // 定义优先队列,按访问次数降序排列,如果次数相同按字典序升序
        pq = new PriorityQueue<>((a, b) -> {
            if (!a.getValue().equals(b.getValue())) {
                return b.getValue() - a.getValue(); // 按访问次数降序
            } else {
                return a.getKey().compareTo(b.getKey()); // 按字典序升序
            }
        });

        // 将 TreeMap 中的所有条目加入优先队列
        pq.addAll(urlCount.entrySet());

        // 使用 StringJoiner 拼接结果
        StringJoiner sj = new StringJoiner(",");
        for (int i = 0; i < n && !pq.isEmpty(); i++) {
            sj.add(pq.poll().getKey()); // 取出队列中最优先的 URL
        }
        return sj.toString();
    }

    /**
     * 判断字符串是否为数字
     *
     * @param str 输入字符串
     * @return 如果是数字返回 true,否则返回 false
     */
    private static boolean isNumeric(String str) {
        try {
            Integer.parseInt(str); // 尝试将字符串转换为整数
            return true;
        } catch (NumberFormatException e) {
            return false; // 转换失败说明不是数字
        }
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

数据结构选用:

使用对象 urlVisits 存储 URL 和对应的访问次数。
urlVisits 的键为 URL,值为该 URL 的访问次数。
输入处理:

如果输入是 URL,则更新 urlVisits 中对应 URL 的访问次数。
如果输入是数字,则按规则排序并输出访问次数最多的前 n 个 URL。
排序规则:

按访问次数降序排序。
如果访问次数相同,按字典序升序排序。
异步输入:

使用 Node.js 的 readline 模块实现异步输入,允许用户连续输入。
输出处理:

将排序后的前 n 个 URL 提取并用逗号拼接输出

// 使用 readline 模块处理用户输入
const readline = require("readline").createInterface({ input: process.stdin });

// 创建一个异步迭代器用于读取输入
const iterator = readline[Symbol.asyncIterator]();

// 定义一个异步函数来获取输入
const getInput = async () => (await iterator.next()).value;

(async function () {
    // 用对象存储 URL 和访问次数
    const urlVisits = {};

    // 异步循环处理输入
    while ((input = await getInput())) {
        // 将输入尝试转换为数字
        const number = parseInt(input);

        if (isNaN(number)) {
            // 如果输入不是数字,视为 URL,更新访问次数
            urlVisits[input] = (urlVisits[input] ?? 0) + 1;
            continue;
        }

        // 如果输入是数字,按规则排序并输出前 n 个 URL
        const result = Object.entries(urlVisits) // 将对象转为 [key, value] 数组
            .sort((first, second) => 
                second[1] - first[1] || // 先按访问次数降序排序
                first[0].localeCompare(second[0]) // 再按字典序升序排序
            )
            .slice(0, number) // 获取前 n 个元素
            .map((item) => item[0]) // 提取 URL
            .join(","); // 拼接成逗号分隔的字符串

        console.log(result); // 输出结果
    }
})();

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144944004"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!