L1-034 点赞(Java)

发布时间:2024年01月18日

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

输入格式:

输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1?FK”,其中1≤K≤10,Fii=1,?,K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。

输出格式:

统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。

输入样例:

4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123

输出样例:

233 3

解题思路

最开始的思路(运行超时)
  1. 使用一个哈希表(或字典)来存储每个标签的出现次数。
  2. 遍历每篇博文的特性描述,更新哈希表中对应标签的计数。
  3. 遍历哈希表,找到出现次数最多的标签。如果有多个标签并列,选择编号最大的那个。
  4. 输出这个标签的编号和出现次数。

修改后的思路
  1. 处理大量数据时。BufferedReader 读取大块数据并将其缓存,减少了读取输入时的时间开销。
  2. 使用数组而非哈希表:由于标签的编号范围是1到1000,所以代码使用了一个固定长度的数组 tag 来存储每个标签的频率。数组的访问时间复杂度是O(1),这比哈希表更快,尤其是当哈希表的负载因子增加时。
  3. 直接在读取过程中更新频率:代码在读取每个标签时直接更新数组中的频率,这样就不需要单独的步骤来更新频率。
  4. 高效的最大频率查找:最后,代码通过一个简单的循环找到频率最高的标签。由于只需要遍历一次数组,这个过程非常快速。

解题过程中遇到的问题

运行超时:当版本还是HashMap时我的第一反应是将Scanner改为BufferedReader,可是无效。后来仔细想了想之前也是遇到这个情况,用数组而非HashMap,因为数组的访问时间复杂度比HashMap低

代码

import java.io.*; 

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bu = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bu.readLine());
        int[] tag = new int[1001];

        for (int i = 0; i < n; i++) {
            String[] k = bu.readLine().split(" ");
            for (int j = 1; j < k.length; j++) {
                int temp = Integer.parseInt(k[j]);
                tag[temp]++;
            }
        }
        
        int id = 0;
        int max = tag[0];
        for (int i = 1; i <= 1000; i++) {
            if (max <= tag[i]) {
                max = tag[i];
                id = i;
            }
        }
        System.out.print(id + " " + max);
    }
}

最开始版本(运行超时版)做个区别

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        Map<Integer,Integer> tagFrequency = new HashMap<>();
        for (int i = 0; i < N; i++) {
            int K = scanner.nextInt(); // 博文的特性标签数量
            for (int j = 0; j < K; j++) {
                int tag = scanner.nextInt();
                tagFrequency.put(tag, tagFrequency.getOrDefault(tag, 0) + 1);
            }
        }

        int maxFrequencyTag = 0;
        int maxFrequency = 0;
        for (Map.Entry<Integer, Integer> entry : tagFrequency.entrySet()) {
            int tag = entry.getKey();
            int frequency = entry.getValue();
            if (frequency > maxFrequency || (frequency == maxFrequency && tag > maxFrequencyTag)) {
                maxFrequencyTag = tag;
                maxFrequency = frequency;
            }
        }

        System.out.println(maxFrequencyTag + " " + maxFrequency);

    }
}
文章来源:https://blog.csdn.net/Gracener/article/details/135672016
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。