題目描述
設計一個簡化版的推特(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);
算法思路
根據示例,第一思路是給每個用戶一個推文空間,然後把博主和關注者的推文都放到博主推文空間,然後保證推文空間大小爲10條,然後更新維護推文空間和博主的關注列表即可,但是取關後要修改推文空間……
雖然現在看來貌似也行,但是我還是改變了思路……
class Twitter:
def __init__(self):
self.d_follow = {}
self.d_food = []
self.limit = 10
def postTweet(self, userId: int, tweetId: int) -> None:
if userId not in self.d_follow:
self.d_follow[userId] = {userId}
self.d_food.insert(0, (userId, tweetId))
def getNewsFeed(self, userId: int):
if userId not in self.d_follow:
self.d_follow[userId] = {userId}
res = []
ID = self.d_follow[userId]
i = 0
while len(res) < 10 and i < len(self.d_food):
f = self.d_food[i]
if f[0] in ID:
res.append(f[1])
i += 1
return res
def follow(self, followerId: int, followeeId: int) -> None:
if followerId in self.d_follow:
self.d_follow[followerId].add(followeeId)
else:
self.d_follow[followerId] = {followeeId, followerId}
def unfollow(self, followerId: int, followeeId: int) -> None:
try:
if followerId==followeeId:return
self.d_follow[followerId].discard(followeeId)
except:
pass
執行用時 :496 ms, 在所有 Python3 提交中擊敗了6.40%的用戶
內存消耗 :19.1 MB, 在所有 Python3 提交中擊敗了100.00%的用戶