【leetcode系列】【算法】【中等】设计推特

题目:

题目链接: 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)
发布了115 篇原创文章 · 获赞 11 · 访问量 1675

猜你喜欢

转载自blog.csdn.net/songyuwen0808/article/details/105491174