【华为机试题】(2022.4.6)舆情热词

这是一道华为面试题,要求根据新闻标题和正文,找出出现频率最高的topN个词语,标题中词语权重更高。解决方案涉及容器使用和多级排序,通过统计词频和词序,使用列表和自定义比较器进行排序。
摘要由CSDN通过智能技术生成

舆情热词

题目

用使用" "作为分隔词语的分隔符进行分词。
M篇新闻按照新闻发布的先后顺序处理完开输入,现在希望对所有新闻中出现的词语进行处理,输出出现频率最高的topN个个词语,作为热词。标题中出现的词语频率系数为3,正文中出现的词语炳率系数为1;返回的答案应该按照词语出现频率由高到低排序,当词语出现的频率相同时,在标题中出现的频率次数高的排在前面;如果仍然相同,则按照词语在标题中出现的先后顺序进行排序,先出现的排在前面;如果仍然相同,则按照词语在正文中出现的先后顺序进行排序,先出现的排在前面。


输入要求

第—行输入为正格数topN和文 章数M,即要输出的出现频率最高的词语的个数和处理的文 章的数量,由于每篇文章被处理为标题和正文2行,因此后面有2*M行数据。从第二行起,是按顺序处理后每篇文章的标题里和正文串,即第二行是第篇文章的标题串,第三行是第一篇文章的正文串,第四行是第二篇文章的标题串,第五行是第二篇文章的正文里,以此类推。
在这里插入图片描述

输出要求

使用一行输出出现频率最高的topN个词语,每个词语以“ ”隔开。

示例

输入

3 2
xinguan feiyan xinzeng bendi quezhen anli
ju baodao chengdu xinzeng xinguan feiyan bendi quezhen anli yili shenzhen xinzeng bendi quezhen anli liangli yiqing zhhengti kongzhi lianghao
xinguan yimiao linchuang shiyan
wuzhong xinguan yimiao tongguo sanqi linchuang shiyan xiaoguo lianghao

输出

xinguan xinzeng bendi

思路

本题考察对容器的使用以及多级排序。可以考虑将标题词频,词序(第一次出现的顺序),以及正文的词频,词序(第一次出现的顺序)单独统计放在不同的容器中。使用set()集合存放所有词(不重复),进行遍历,将每个词、词频总计、标题词频、标题词序、和正文词频、正文词序进行封装放入List,并提供比较器进行排序。

代码实现

java代码:

public class BreakWordTopN {
   
    public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        int topN=0;
        int articles=0;
        String params = sc.nextLine();
        String[] param = params.split(" ");
        topN = Integer.valueOf(param[0]);
        articles = Integer.valueOf(param[1]);
        //System.out.println("topN:" + topN+",articles:" + articles);

        Map<String, Integer> titles = new HashMap<>();//标题中词频
        Map<String, Integer> titlesSeq = new HashMap<>();//标题中第一次出现这个词的顺序
        Map<String, Integer> contents = new HashMap<>();//正文中词频
        Map<String, Integer> contentsSeq = new HashMap<>();//正文中第一次出现这个词的顺序
        Set<String> words = new HashSet();

        int seqTitle = 0;//标题词顺序索引
        int seqContent = 0;//正文词顺序索引
        for (int i = 0; i < articles; i++) {
   
            String lineTitle = sc.nextLine();
            //统计标题词频和词序
            for (String word : lineTitle.split(" ")) {
   
                titles.put(word, titles
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值