华为OD题目:快递投放问题
有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,
每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递
输入描述
1、第一行输入M N,M个包裹N个道路信息
2、0<=M.N<=100
3、检查站禁止通行的包裹如果有多个以空格分开
输出描述
输出不能送达的包裹,如:package2 package4如果所有包惠都可以送达则输出: none
输出结果按照升序排列Q
示例1:
4 2
package1 A C
package2 A C
package3 B C
package4 A C
A B package1
A C package2
输出
package2
说明
4个包裹,2个禁止通行信息.
接下来的4行是每个包裹的名称,起点,终点。
最后2行是两个站点之间无法通行的包裹名称
4 2
package1 A C
package2 A C
package3 B C
package4 A C
A B package1
A C package2 package4
输出
package2 package4
解题思路:
- 用hashmap来放包裹,key是路径,value是包裹set, 因为一条路径会有多个包裹
- 然后遍历就,将禁止的包裹存放在list里面,排序后输出就可以了
public class My {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] strings = str.split(" ");
int m = Integer.parseInt(strings[0]);
int n = Integer.parseInt(strings[1]);
Map<String, Set<String>> packageMap = new HashMap<>();
for (int i = 0; i < m; i++) {
String line = sc.nextLine();
String[] split = line.split(" ");
String packInfo = split[0];
String road = split[1] + split[2];
Set<String> set = packageMap.getOrDefault(road, new HashSet<>());
set.add(packInfo);
packageMap.put(road, set);
}
//下面是禁止的信息
List<String> forbiddenList = new ArrayList<>();
for (int i = 0; i < n; i++) {
String line = sc.nextLine();
String[] split = line.split(" ");
String forbiddenRoad = split[0] + split[1];
Set<String> packSet = packageMap.get(forbiddenRoad);
//如果当前禁止的路段没有要运输的包裹,那么进入下个循环
if (packSet == null || packSet.size() == 0) {
continue;
}
for (int j = 2; j < split.length; j++) {
String currForbid = split[j];
if (packSet.contains(currForbid)) {
forbiddenList.add(currForbid);
}
}
}
forbiddenList.sort(String::compareTo);
//下面是打印结果
StringBuilder sb = new StringBuilder();
for (int i = 0; i < forbiddenList.size(); i++) {
if (i != 0) {
sb.append(" ");
}
sb.append(forbiddenList.get(i));
}
System.out.println(sb);
}
}