LeetCode 355. Design Twitter

relevant: system design of twitter

Problem Clarification

Design a simplified version of Twitter with methods:

Analysis

Code

code example from https://leetcode.com/problems/design-twitter/discuss/82863/Python-solution

class Twitter(object):

    def __init__(self):
        self.timer = itertools.count(step=-1)
        self.tweets = collections.defaultdict(collections.deque)
        self.followees = collections.defaultdict(set)

    def postTweet(self, userId, tweetId):
        self.tweets[userId].appendleft((next(self.timer), tweetId))

    def getNewsFeed(self, userId):
        tweets = heapq.merge(*(self.tweets[u] for u in self.followees[userId] | {userId}))
        return [t for _, t in itertools.islice(tweets, 10)]

    def follow(self, followerId, followeeId):
        self.followees[followerId].add(followeeId)

    def unfollow(self, followerId, followeeId):
        self.followees[followerId].discard(followeeId)

Implementation tricks

Edge Test Cases

  1. follow self. wrong: list(self.followees[userId]) + [userId]; right: self.followee[userId] | {userId}

    Input: ["Twitter","postTweet","follow","getNewsFeed"]
            [[],[1,5],[1,1],[1]]
    Output: wrong: [null,null,null,[5,5]]
             right: [null,null,null,[5]]
    
  2. more than 10 tweets in total

    Input: ["Twitter","postTweet","postTweet","postTweet","postTweet","postTweet","postTweet","postTweet","postTweet","postTweet","postTweet","postTweet","getNewsFeed"]
            [[],[1,5],[1,3],[1,101],[1,13],[1,10],[1,2],[1,94],[1,505],[1,333],[1,22],[1,11],[1]]
    Output: wrong: [null,null,null,null,null,null,null,null,null,null,null,null,[11,22,333,505,94,2,10,13,101,3,5]]
            right: [null,null,null,null,null,null,null,null,null,null,null,null,[11,22,333,505,94,2,10,13,101,3]]