舆情热词
题目
用使用" "作为分隔词语的分隔符进行分词。
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