设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:
postTweet(userId, tweetId)
: 创建一条新的推文getNewsFeed(userId)
: 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。follow(followerId, followeeId)
: 关注一个用户unfollow(followerId, followeeId)
: 取消关注一个用户
示例:Twitter twitter = new Twitter();
// 用户1发送了一条新推文 (用户id = 1, 推文id = 5).
twitter.postTweet(1, 5);
// 用户1的获取推文应当返回一个列表,其中包含一个id为5的推文.
twitter.getNewsFeed(1);
// 用户1关注了用户2.
twitter.follow(1, 2);
// 用户2发送了一个新推文 (推文id = 6).
twitter.postTweet(2, 6);
// 用户1的获取推文应当返回一个列表,其中包含两个推文,id分别为 -> [6, 5].
// 推文id6应当在推文id5之前,因为它是在5之后发送的.
twitter.getNewsFeed(1);
// 用户1取消关注了用户2.
twitter.unfollow(1, 2);
// 用户1的获取推文应当返回一个列表,其中包含一个id为5的推文.
// 因为用户1已经不再关注用户2.
twitter.getNewsFeed(1);
1.哈希+列表
Python解答:
```python
class Twitter:
def __init__(self):
self.index = 0
self.user = {}
self.twitter = {}
def postTweet(self, userId: int, tweetId: int) -> None:
if userId not in self.user.keys():
self.user[userId] = set([userId])
self.twitter[userId] = [(self.index, tweetId)]
elif userId not in self.twitter.keys():
self.twitter[userId] = [(self.index, tweetId)]
else:
self.twitter[userId].append((self.index, tweetId))
self.index += 1
def getNewsFeed(self, userId: int) -> List[str]:
temp = []
if self.twitter:
for item in self.user[userId]:
if item in self.twitter.keys():
temp.extend(self.twitter[item])
temp.sort(key=(lambda x:x[0]), reverse=True)
return [temp[i][1] for i in range(min(10, len(temp)))]
else:
return []
def follow(self, followerId: int, followeeId: int) -> None:
if followerId not in self.user.keys():
self.user[followerId] = set([followerId])
self.user[followerId].add(followeeId)
def unfollow(self, followerId: int, followeeId: int) -> None:
if followerId not in self.user.keys():
self.user[followerId] = set([followerId])
elif followeeId in self.user[followerId]:
self.user[followerId].remove(followeeId)
# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
留言