算法每一题,成长每一天~
C0E31 单词接龙
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
Java
package com.ccr.paper_f;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class C0E31 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int k = Integer.parseInt(in.nextLine());
int n = Integer.parseInt(in.nextLine());
// 排序规则
Comparator<String> comparator =
Comparator.comparing(String::length, Comparator.reverseOrder()) // 长度降序
.thenComparing(String::compareTo); // 字典序
String first = null;
PriorityQueue<String>[] arr = new PriorityQueue[26]; // 26个字母,将首字母相同的,放到一个Queue
for (int i = 0; i < n; i++) {
if (i == k) {
first = in.nextLine();
} else {
String line = in.nextLine();
int idx = line.charAt(0) - 'a';
if (arr[idx] == null) {
arr[idx] = new PriorityQueue<>(comparator);
}
arr[idx].add(line);
}
}
assert first != null;
String current = first;
StringBuilder sb = new StringBuilder(current);
while (true) {
// 最后一个字母
int idx = current.charAt(current.length() - 1) - 'a';
PriorityQueue<String> queue = arr[idx];
if (queue == null || queue.isEmpty()) {
break;
}
current = queue.poll();
sb.append(current);
}
System.out.println(sb.toString());
}
}
总结
1、利用PriorityQueue<>
的排序队列特性。
2、复习Comparator.comparing().thenComparing();
算法要多练多练多练!!