[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
 
posted @ 2020-12-18 20:59  LintCode领扣  阅读(81)  评论(0)    收藏  举报