[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