来源于陈C同学(CC)
来源于陈C同学(CC)
来源于陈C同学(CC)
12 设计推特
作者: Turbo时间限制: 1S章节: 课程设计
问题描述 :
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10 条推文。
实现 Twitter 类:
Twitter() :初始化简易版推特对象
void postTweet(int userId, int tweetId) :根据给定的 tweetId 和 userId 创建一条新推文。每次调用此函数都会使用一个不同的 tweetId 。
vector<int> getNewsFeed(int userId) :检索当前用户新闻推送中最近 10 条推文的 ID 。新闻推送中的每一项都必须是由用户关注的人或者是用户自己发布的推文。推文必须 按照时间顺序由最近到最远排序 。
void follow(int followerId, int followeeId): ID 为 followerId 的用户开始关注 ID 为 followeeId 的用户。
void unfollow(int followerId, int followeeId): ID 为 followerId 的用户不再关注 ID 为 followeeId 的用户。
示例:
输入
postTweet 1 5
getNewsFeed 1
follow 1 2
postTweet 2 6
getNewsFeed 1
unfollow 1 2
getNewsFeed 1
输出
5
6 5
5
解释
twitter.postTweet(1, 5); // 用户 1 发送了一条新推文 (用户 id = 1, 推文 id = 5)
twitter.getNewsFeed(1); // 用户 1 的获取推文应当返回一个列表,其中包含一个 id 为 5 的推文
twitter.follow(1, 2); // 用户 1 关注了用户 2
twitter.postTweet(2, 6); // 用户 2 发送了一个新推文 (推文 id = 6)
twitter.getNewsFeed(1); // 用户 1 的获取推文应当返回一个列表,其中包含两个推文,id 分别为 -> [6, 5] 。推文 id 6 应当在推文 id 5 之前,因为它是在 5 之后发送的
twitter.unfollow(1, 2); // 用户 1 取消关注了用户 2
twitter.getNewsFeed(1); // 用户 1 获取推文应当返回一个列表,其中包含一个 id 为 5 的推文。因为用户 1 已经不再关注用户 2
输入说明 :
输入若干行
每行输入为postTweet、getNewsFeed、follow或者unfollow:
如果指令为postTweet类型,后面需要输入两个整数表示tweetId 和 userId
如果指令为getNewsFeed类型,后面需要输入一个整数表示userId
如果指令为follow类型,后面需要输入两个整数followerId和followeeId
如果指令为unfollow类型,后面需要输入两个整数followerId和followeeId
提示:
1 <= userId, followerId, followeeId <= 500
0 <= tweetId <= 10^4
所有推特的 ID 都互不相同
postTweet、getNewsFeed、follow 和 unfollow 方法最多调用 3 * 10^4 次
输出说明 :
输出若干行:
每行为若干整数,为getNewsFeed指令的返回值,每个整数后跟一个空格。
postTweet 1 1
getNewsFeed 1
follow 1 2
getNewsFeed 1
unfollow 1 2
postTweet 2 3
getNewsFeed 2
---------
1
1
3
#include <bits/stdc++.h>
using namespace std;
typedef typename std::pair<int,int> MyPair;//first为时间,second为文章
class Twitter
{
std::unordered_map<int ,vector<MyPair>> UTNews;
std::unordered_map<int ,set<int>>UTUsers;
int TimePriority;
public:
Twitter():TimePriority(0){}
void postTweet(int userId, int tweetId);
vector<int> getNewsFeed(int userId);
void follow(int followerId, int followeeId);
void unfollow(int followerId, int followeeId);
};
void Twitter::postTweet(int userId, int tweetId)
{
UTNews[userId].push_back(make_pair(++TimePriority, tweetId));
}
vector<int> Twitter::getNewsFeed(int userId)
{
vector<MyPair> tmp(0);
set<int> Followees=UTUsers[userId];
set<int>::iterator i=Followees.begin(),SetEnd=Followees.end();
for(i=Followees.begin();i!=SetEnd;i++)
{
if(UTNews.find(*i)!=UTNews.end())
{
tmp.insert(tmp.end(),UTNews[*i].begin(),UTNews[*i].end());
}
}
tmp.insert(tmp.end(),UTNews[userId].begin(),UTNews[userId].end());
sort(tmp.begin(),tmp.end(),greater<MyPair>());
vector<int> result(0);
int size=tmp.size()<10?tmp.size():10,j;
for(j=0; j<size; j++)
{
result.push_back(tmp[j].second);
}
return result;
}
void Twitter::follow(int followerId, int followeeId)
{
UTUsers[followerId].insert(followeeId);
}
void Twitter::unfollow(int followerId, int followeeId)
{
auto i=UTUsers[followerId].find(followeeId);
UTUsers[followerId].erase(i);
}
int main()
{
string str;
int userid,tweetid,followerid,followeeid,i;
Twitter CcTwitter;
vector<int> tmp;
while(cin>>str)
{
if(str=="postTweet")
{
cin>>userid>>tweetid;
CcTwitter.postTweet(userid, tweetid);
}
else if(str=="getNewsFeed")
{
cin>>userid;
tmp=CcTwitter.getNewsFeed(userid);
for(i=0;i<tmp.size();i++)
{
cout<<tmp[i]<<" ";
}
cout<<endl;
}
else if(str=="follow")
{
cin>>followerid>>followeeid;
CcTwitter.follow(followerid,followeeid);
}
else
{
cin>>followerid>>followeeid;
CcTwitter.unfollow(followerid,followeeid);
}
}
return 0;
}