0
点赞
收藏
分享

微信扫一扫

2022华为机试4.6第一题舆情热词题解

软件共享软件 2022-04-18 阅读 39

第一道AC,后来复盘了一下,简化了代码。

题目链接:​​​​​​舆情热词题目链接

思路:本题可以利用LinkedHashMap来保证输入输出顺序,那么在定义比较器时仅考虑频次即可。有个细节:最后输出的结果不能有空格“ ”,否则不通过。可以有两种思路:1.利用优先队列 2.字符串删除空格。

package liuhao.njupt;

import java.util.*;

public class huawei0406_1 {
    public static void main (String[] args){
        Scanner sc = new Scanner(System.in);
        LinkedHashMap<String, int[]> map = new LinkedHashMap<>();
        while (sc.hasNextLine()){
            int N = sc.nextInt();
            int M = sc.nextInt();
            sc.nextLine();
            for (int p = 0; p < M; p ++){
                String[] title = sc.nextLine().split(" ");
                String[] paper = sc.nextLine().split(" ");
                for (int k = 0;  k < title.length; k ++){
                    String s = title[k];
                    if (!map.containsKey(s)){
                        map.put(s, new int[]{k, 1, 0}); //int[]存放:下标,标题个数,正文中的个数;
                    }else {
                        map.get(s)[1] += 1;
                    }
                }
                for (int i = 0; i < paper.length; i ++){
                    String s1 = paper[i];
                    if (!map.containsKey(s1)){
                        map.put(s1, new int[]{i, 0, 1}); //int[]存放:下标,个数,正文中的个数;
                    }else {
                        map.get(s1)[2] += 1;
                    }
                }
            }
            List<Map.Entry<String, int[]>> list = new ArrayList<>(map.entrySet());
            list.sort((o1, o2) -> {
                int[] arr1 = o1.getValue();
                int[] arr2 = o2.getValue();
                int v1 = arr1[1]*3 + arr1[2];
                int v2 = arr2[1]*3 + arr2[2];
                if (v1 != v2){
                    return v2 - v1;
                }
                return 0;
            });
            
            //删除最后的空格
            StringBuilder sb = new StringBuilder();
            for (Map.Entry<String, int[]> entry : list){
                sb.append(entry.getKey()).append(" ");
            }
            String[] str = sb.toString().split(" ");
            StringBuilder sb1 = new StringBuilder();
            for (int i = 0; i < N - 1; i ++){
                sb1.append(str[i]).append(" ");
            }
            sb1.append(str[N-1]);
            System.out.print(sb1.toString());
        }
    }
}

//使用优先队列 

PriorityQueue<Map.Entry<String, Integer[]>> pq = new PriorityQueue<>((o1, o2) -> {
                Integer[] arr1 = o1.getValue();
                Integer[] arr2 = o2.getValue();
                Integer v1 = 3*arr1[1]+arr1[3];//频率
                Integer v2 = 3*arr2[1]+arr2[3];
                if (!v1.equals(v2)){
                    return v2 - v1;
                }
                return 0;
            });
            pq.addAll(map.entrySet());
            for (int i = 0; i < N-1; i ++){
                Map.Entry<String, Integer[]> e2 = pq.poll();
                assert e2 != null;
                System.out.print(e2.getKey() + " ");
            }
            System.out.print(Objects.requireNonNull(pq.poll()).getKey());

运行结果:

 

 

举报

相关推荐

0 条评论