PTA悄悄关注

7-11 悄悄关注 (25 分)

新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。

输入格式:

输入首先在第一行给出某用户的关注列表,格式如下:

人数N 用户1 用户2 …… 用户N

其中N是不超过5000的正整数,每个用户ii=1, ..., N)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。

之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M,随后M行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。

输出格式:

我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。

输入样例1:

10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60

输出样例1:

Ammy
Cath
Pota
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
map<string, int>gz, dz;

int main()
{
	int num1;
	string name1;
	cin >> num1;
	for (int i = 0; i < num1; i++) {
		cin >> name1;
		gz[name1] = 1;
	}
	int num2;
	cin >> num2;
	int sum = 0;
	int t;
	string a[10000];
	for (int i = 0; i < num2; i++) {
		cin >> a[i] >> t;
		dz[a[i]] = t;
		sum += t;
	}
	sort(a, a + num2);
	sum = sum / num2;
	int flag = 0;
	for (int i = 0; i < num2; i++)
	{
		if (gz[a[i]]==0&&dz[a[i]]>sum)
		{
			flag = 1;
			cout << a[i] << endl;
		}
	}
	if (flag == 0)
		cout << "Bing Mei You" << endl;
	return 0;
}

 

<think>好的,我现在需要处理用户关于L2-019问题与Java实现悄悄关注功能的问题。首先,我需要弄清楚用户提到的L2-019具体是什么。根据常见的编程题库,比如PTA(拼题A)中的题目,L2-019通常是关于社交网络中的关注悄悄关注的问题。这类题目通常要求处理用户之间的关系,特别是非互相关注的情况,也就是所谓的“悄悄关注”。 用户的需求是了解如何用Java实现这个功能。接下来,我需要结合用户提供的引用内容,看看是否有相关的信息可以利用。用户给出的引用包括机器学习、Spring Boot整合、Java邮件处理和客户信息管理系统,但这些似乎与社交网络关注功能没有直接关联。过,客户信息管理系统[^4]涉及数据库操作,可能涉及到用户信息的存储和查询,这可能对实现关注功能有帮助。 首先,我需要明确问题的核心:如何检测用户A是否悄悄关注用户B。根据常规定义,悄悄关注指的是用户A关注用户B,但用户B没有关注用户A。因此,实现的关键在于比较两个用户关注表,并找出这种非对称关系。 接下来,考虑数据结构的设计。可以使用Map来存储每个用户及其关注表。例如,使用HashMap<String, Set<String>>,其中键是用户ID,值是该用户关注用户集合。这样,检查用户B是否在用户A的关注表中,同时用户A用户B的关注表中即可判断是否存在悄悄关注。 然后,处理输入和输出。需要读取用户表和他们的关注关系,这可能涉及文件读取或控制台输入。在Java中,可以使用Scanner类读取输入数据,并将数据存储到定义的数据结构中。之后,遍历目标用户关注表,检查每个被关注用户是否符合悄悄关注的条件。 另外,用户提到的引用[4]是关于客户信息管理系统的,可能涉及数据库操作。如果数据量较大,可能需要将用户信息存储在MySQL数据库中,并使用JDBC进行查询。但题目L2-019通常是算法题,可能需要数据库,而是直接处理输入数据。过,用户可能希望了解实际应用中的实现方式,因此可以简要提到数据库的存储方式。 在实现过程中,需要注意性能优化,比如使用HashSet来快速查找用户是否存在,这样时间复杂度较低。同时,可能需要处理大量的用户数据,因此高效的数据结构是关键。 最后,生成相关的问题,帮助用户进一步理解。例如,如何优化查询效率,如何处理大数据量,或者如何扩展到更复杂的社交网络功能。 总结步骤: 1. 确定问题需求:检测悄悄关注关系。 2. 设计数据结构:使用Map和Set存储用户关系。 3. 实现输入解析:读取用户关注表。 4. 遍历检查条件:判断是否存在非互相关注。 5. 输出结果:符合条件的用户表。 6. 可能的扩展:数据库集成或性能优化。 现在需要将这些思路整理成结构化的回答,确保引用合适的参考文献,并生成相关问题。</think>### L2-019 Java 实现悄悄关注功能 **问题分析** L2-019问题通常要求实现社交网络中用户的"悄悄关注"功能。其核心逻辑是:用户A关注用户B,但用户B未关注用户A时,用户B被标记为悄悄关注对象。需通过数据结构设计、关系比对和结果输出三个步骤实现。 --- ### 实现步骤 #### 1. 数据结构设计 使用`HashMap`存储用户关注关系,键为用户ID,值为该用户关注用户集合(`HashSet`)。 ```java Map<String, Set<String>> userMap = new HashMap<>(); ``` #### 2. 输入解析与关系存储 假设输入格式为: ``` 用户数 N 用户1 关注用户数 K 用户a 用户b ... 用户2 关注用户数 M 用户c 用户d ... ... ``` 读取数据并填充`userMap`: ```java Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); for (int i = 0; i < n; i++) { String user = scanner.next(); int k = scanner.nextInt(); Set<String> follows = new HashSet<>(); for (int j = 0; j < k; j++) { follows.add(scanner.next()); } userMap.put(user, follows); } ``` #### 3. 检测悄悄关注 遍历目标用户(如`targetUser`)的关注表,检查每个被关注用户是否满足: - 被关注用户在`targetUser`的粉丝表中 ```java List<String> result = new ArrayList<>(); Set<String> targetFollows = userMap.get(targetUser); for (String followedUser : targetFollows) { if (!userMap.containsKey(followedUser) || !userMap.get(followedUser).contains(targetUser)) { result.add(followedUser); } } ``` #### 4. 结果输出 按字典序输出符合条件的用户: ```java Collections.sort(result); for (String user : result) { System.out.print(user + " "); } ``` --- ### 扩展:实际应用中的优化 - **数据库存储**:若用户量庞大,可将关注关系存储在MySQL中,通过联合查询实现高效检索[^4]。 - **缓存机制**:使用Redis缓存高频访问的用户关系数据,减少数据库压力[^2]。 - **分布式处理**:分片存储用户数据,适用于超大规模社交网络场景[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值