L1-020 帅到没朋友(20分)[java][python]

4 阅读5分钟

题目编号: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 朋友圈里的人,以及从未出现的人,都没有朋友

实现步骤:

  1. HashMap 记录每个ID的朋友数量(只记录 K > 1 的朋友圈)
  2. 读入查询ID,逐一判断:
    • 如果该ID在 HashMap 中没有记录(即 mp[id] == 0),则此人没朋友
    • 为避免同一ID被重复输出,查询后将 mp[id] = 1 标记
  3. 按查询顺序收集结果,空则输出 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)

总结

本题关键在于理解"没有朋友"的定义:

  1. 从未出现的人 → 没有朋友
  2. 只出现在 K=1 的朋友圈 → 没有朋友
  3. 出现在 K>1 的朋友圈 → 有朋友

HashMap/HashSet 标记有朋友的人,再逐一判断查询即可。