题目:
题目链接: https://leetcode-cn.com/problems/design-twitter/
解题思路:
hash + 双向链表
hash表key是用户,value是该用户关注的用户列表
双向链表保存的是用户发送的推特,前面的是最新发送的,后面的是较旧的
为了实现方便,我把所有人发送的推特放到一个双向链表里了
其实应该每个用户创建一个双向链表,然后获取推特内容的时候,使用 合并K个排序链表 的方式,获取最新的10条推特,然后返回
使用双向链表的原因,是为了可能会有删除操作,所以刚开始设计了双向链表
对于此题,应该单向链表就满足条件了
代码实现:
class Node:
def __init__(self, user_id, tweet_id, pre = None, nxt = None):
self.user_id = user_id
self.tweet_id = tweet_id
self.pre = pre
self.nxt = nxt
class Twitter:
def __init__(self):
"""
Initialize your data structure here.
"""
self.head = Node('head', 'head')
self.tail = Node('tail', 'tail')
self.head.next = self.tail
self.tail.prev = self.head
self.rec = collections.defaultdict(dict)
def postTweet(self, userId: int, tweetId: int) -> None:
"""
Compose a new tweet.
"""
node = Node(userId, tweetId)
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def getNewsFeed(self, userId: int) -> List[int]:
"""
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
"""
curr_head = self.head
res = []
while curr_head.next is not self.tail:
if curr_head.next.user_id in self.rec[userId] or curr_head.next.user_id == userId:
res.append(curr_head.next.tweet_id)
if len(res) == 10:
break
curr_head = curr_head.next
return res
def follow(self, followerId: int, followeeId: int) -> None:
"""
Follower follows a followee. If the operation is invalid, it should be a no-op.
"""
self.rec[followerId][followeeId] = 1
def unfollow(self, followerId: int, followeeId: int) -> None:
"""
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
"""
if followerId in self.rec and followeeId in self.rec[followerId]:
self.rec[followerId].pop(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)