[leetcode/lintcode 題解] Amazon 面試題:迷你推特

實現一個迷你的推特,支持下列幾種方法
  1. postTweet(user_id, tweet_text). 發佈一條推特.
  2. getTimeline(user_id). 得到給定用戶最新發布的十條推特,按照發布時間從最近的到以前排序
  3. getNewsFeed(user_id). 得到給定用戶的朋友或者他本身發佈的最新十條推特,從發佈時間最近到以前排序
  4. follow(from_user_id, to_user_id). from_user_id 關注 to_user_id.
  5. unfollow(from_user_id, to_user_id). from_user_id 取消關注 to_user_id.
 
在線評測地址:領釦題庫官網
 
樣例 1:
題解
由於題目裏涉及到對推文按照時間排序, 同時 Tweet 類自己不含時間信息, 因此咱們須要額外地記錄每條推文發出的時間.
能夠定義一個類的靜態變量做爲計數器來實現.
而後分析咱們須要的數據結構:
  • class Node {Tweet, int}; 對原有的Tweet類的擴展, 使其能夠記錄時間 (固然, 也能夠用類的繼承來實現)
  • map<int, vector<Node>> 用戶id到這個用戶發送了的推文的映射
  • map<int, set<int>> 用戶id到這個用戶關注的人的id的映射
而後對應每種方法的實現:
  • postTweet() 直接添加到map<int, vector<Node>>中便可
  • getTimeline() 根據map<int, vector<Node>>得到該用戶的最新推文, 返回便可
  • getNewsFeed() 同時用到上面定義的兩個映射, 比較暴力的作法是獲取這些用戶的全部推文, 排序, 拿出前十個; 或者能夠利用堆進行 "多路歸併"
  • follow()map<int, set<int>> 中添加便可
  • unfollow()map<int, set<int>> 中刪除便可
(本題解使用C++相關數據結構描述, 不過映射和集合在其餘語言中也有對應的實現)
 
更多題解參考:九章官網solution
相關文章
相關標籤/搜索