题目编号:L1-020 分数:20分 语言:Java、Python
题目描述
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
输入格式
- 第一行:正整数
N(≤100),已知朋友圈的个数 - 随后 N 行:每行首先给出一个正整数
K(≤1000),为朋友圈中的人数,然后列出该朋友圈内的所有人ID(5位数字,从00000到99999),ID间以空格分隔 - 之后一行:正整数
M(≤10000),待查询的人数 - 最后一行:
M个待查询的ID,以空格分隔
注意: 没有朋友的人可以是根本没安装"朋友圈",也可以是只有自己一个人在朋友圈的人。题目保证所有 K 超过1的朋友圈里都至少有2个不同的人。
输出格式
按输入的顺序输出那些帅到没朋友的人,ID间用1个空格分隔,行的首尾不得有多余空格。
- 如果没有人太帅,则输出
No one is handsome - 同一个人可以被查询多次,但只输出一次
样例
样例1
输入
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
输出
10000 88888 23333
样例2
输入
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
输出
No one is handsome
解题思路
本题本质上是要找出哪些人实际上没有朋友。
核心规则:
K > 1的朋友圈:圈内所有人互相是朋友K == 1的朋友圈:只有自己一个人,不算有朋友- 没有出现在任何朋友圈的人:不算有朋友
关键判断逻辑:
- 只有
K > 1的朋友圈中的人,才算有朋友 K == 1朋友圈里的人,以及从未出现的人,都没有朋友
实现步骤:
- 用
HashMap记录每个ID的朋友数量(只记录K > 1的朋友圈) - 读入查询ID,逐一判断:
- 如果该ID在
HashMap中没有记录(即mp[id] == 0),则此人没朋友 - 为避免同一ID被重复输出,查询后将
mp[id] = 1标记
- 如果该ID在
- 按查询顺序收集结果,空则输出
No one is handsome
注意事项:
- ID 是 5 位数字(可能含前导0),Java 中需用
String处理 - 朋友圈人数
K == 1时不算有朋友 - 重复查询只输出一次
代码实现
Java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine().trim());
// 用 HashMap 记录每个 ID 的朋友数量,K>1 时才计入
Map<String, Integer> mp = new HashMap<>();
for (int i = 0; i < N; i++) {
String[] parts = br.readLine().trim().split("\\s+");
int K = Integer.parseInt(parts[0]);
for (int j = 1; j <= K; j++) {
String id = parts[j];
if (K > 1) {
mp.put(id, mp.getOrDefault(id, 0) + K);
}
}
}
int M = Integer.parseInt(br.readLine().trim());
String[] queries = br.readLine().trim().split("\\s+");
List<String> result = new ArrayList<>();
for (String id : queries) {
if (!mp.containsKey(id)) {
result.add(id);
mp.put(id, 1); // 标记,防止重复加入
}
}
if (result.isEmpty()) {
System.out.print("No one is handsome");
} else {
for (int i = 0; i < result.size(); i++) {
if (i > 0) System.out.print(" ");
System.out.print(result.get(i));
}
}
}
}
Python
N = int(input())
friend_count = {}
for _ in range(N):
parts = input().strip().split()
K = int(parts[0])
ids = parts[1:]
if K > 1:
for id_ in ids:
friend_count[id_] = friend_count.get(id_, 0) + K
M = int(input())
queries = input().strip().split()
result = []
for id_ in queries:
if id_ not in friend_count:
result.append(id_)
friend_count[id_] = 1 # 标记,避免重复加入
if not result:
print("No one is handsome")
else:
print(" ".join(result))
运行验证
样例1 验证
输入
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
分析:
- 朋友圈1(K=3>1):11111, 22222, 55555 → 都有朋友
- 朋友圈2(K=2>1):33333, 44444 → 都有朋友
- 朋友圈3(K=4>1):55555, 66666, 99999, 77777 → 都有朋友
查询:55555(有朋友❌), 44444(有朋友❌), 10000(没朋友✓), 88888(没朋友✓), 22222(有朋友❌), 11111(有朋友❌), 23333(没朋友✓), 88888(已标记,跳过)
输出: 10000 88888 23333 ✓
样例2 验证
输入
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
分析: 所有查询的人都有朋友(出现在 K>1 的朋友圈中)
输出: No one is handsome ✓
复杂度分析
- 时间复杂度: O(N × K + M),遍历所有朋友圈和查询
- 空间复杂度: O(U),U 为不同ID的数量(最多约 N×K + M)
总结
本题关键在于理解"没有朋友"的定义:
- 从未出现的人 → 没有朋友
- 只出现在 K=1 的朋友圈 → 没有朋友
- 出现在 K>1 的朋友圈 → 有朋友
用 HashMap/HashSet 标记有朋友的人,再逐一判断查询即可。