第一道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());
运行结果: