华为2022.4.6笔试第一题

华为2022.4.6笔试第一题
m是文章个数,每一篇文章有一行标题和一行正文,一共有2m行字符串。单词出现在文章,该单词频率+3,单词出现在正文,该单词频率+1
对单词排序:先看频率,频率大放前面,如果频率一样,看单词在标题出现的频率,大的放前面,都一样看谁出现的早。输出前n个单词
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        HashMap<String,Integer> title = new HashMap<>();
        HashMap<String,Integer> text = new HashMap<>();
        HashMap<String,Integer> order = new HashMap<>();
        HashSet<String> looks = new HashSet<>();//出现了那些单词
        int k = 0;
        sc.nextLine();
        for (int i=0;i<2*m;i++){
            String s = sc.nextLine();
            String[] words = s.split(" ");
            for (String word : words){
                looks.add(word);
                if(!order.containsKey(word)){
                    order.put(word, k++);
                }
                if(i%2==0){
                    title.put(word,title.getOrDefault(word, 0)+3);
                }else {
                    text.put(word,text.getOrDefault(word,0)+1);
                }
            }
        }
        PriorityQueue<String> p = new PriorityQueue<>(new Comparator<String>() { @Override public int compare(String o1, String o2) {
                int o1_title = title.getOrDefault(o1, 0);
                int o1_text = text.getOrDefault(o1, 0);
                int o2_title = title.getOrDefault(o2,0);
                int o2_text = text.getOrDefault(o2,0);
                int k1 = order.get(o1);
                int k2 = order.get(o2);
                //小堆
                if(o2_title+o2_text < o1_text+o1_title){
                    return 1;
                }else if(o2_title+o2_text > o1_text+o1_title){
                    return -1;
                }else {
                    if(o2_title < o1_title){
                        return 1;
                    }else if(o2_title > o1_title){
                        return -1;
                    }else {
                        return k2 - k1;//出现位置靠后的放在堆顶
                    }
                }
            }
        });

        for (String look : looks){
            if(p.size()<n){
                p.add(look);
            }else {
                p.add(look);
                p.poll();
            }
        }

        LinkedList<String> list = new LinkedList<>();

        while (p.size()>0){
            String tmp = p.poll();
            list.addFirst(tmp);
        }

        for (int i=0;i<n;i++){
            String tmp = list.get(i);
            if(i==n-1){
                System.out.println(tmp);
            }else {
                System.out.print(tmp+" ");
            }
        }
    }
}


#华为##实习#
全部评论
能说一下题目吗
点赞 回复 分享
发布于 2022-04-08 01:59

相关推荐

01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
2024-12-27 13:08
华南理工大学 Java
蝴蝶飞出了潜水钟丿:多看一眼就会💥
点赞 评论 收藏
分享
评论
2
19
分享

创作者周榜

更多
牛客网
牛客企业服务