【45】355. Design Twitter

 

355. Design Twitter

Description Submission Solutions Add to List

  • Total Accepted: 13769
  • Total Submissions: 55718
  • Difficulty: Medium
  • Contributors: Admin

 

Design a simplified version of Twitter where users can post tweets, follow/unfollow another user and is able to see the 10 most recent tweets in the user's news feed. Your design should support the following methods:

 

  1. postTweet(userId, tweetId): Compose a new tweet.
  2. getNewsFeed(userId): Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
  3. follow(followerId, followeeId): Follower follows a followee.
  4. unfollow(followerId, followeeId): Follower unfollows a followee.

 

Example:

Twitter twitter = new Twitter();

// User 1 posts a new tweet (id = 5).
twitter.postTweet(1, 5);

// User 1's news feed should return a list with 1 tweet id -> [5].
twitter.getNewsFeed(1);

// User 1 follows user 2.
twitter.follow(1, 2);

// User 2 posts a new tweet (id = 6).
twitter.postTweet(2, 6);

// User 1's news feed should return a list with 2 tweet ids -> [6, 5].
// Tweet id 6 should precede tweet id 5 because it is posted after tweet id 5.
twitter.getNewsFeed(1);

// User 1 unfollows user 2.
twitter.unfollow(1, 2);

// User 1's news feed should return a list with 1 tweet id -> [5],
// since user 1 is no longer following user 2.
twitter.getNewsFeed(1);

Solution:

有三个member data:cnt记录时间点,getNewFeeds时提取最新的10个。

unordered_map<int, set<int>> friends用来记录每一个id对应的朋友组(包括他自己)。

unordered_map<int, map<int ,int>> tweets用来记录id与其(时间,tweetId)的映射。

实现功能主要是getNewFeeds(userId):用一个hashmap来记录top10最新的tweeds。遍历userId的所有朋友的所有tweeds,如果其cnt小于top10的begin()则说明这条推特比较老,不加入。如果top10的size大于10,直接erase begin。最后倒叙遍历top10,push进result。

 1 class Twitter {
 2 public:
 3     /** Initialize your data structure here. */
 4     Twitter() {
 5         int cnt = 0;
 6     }
 7     
 8     /** Compose a new tweet. */
 9     void postTweet(int userId, int tweetId) {
10         follow(userId, userId);//相当于自己follow自己
11         tweets[userId].insert({cnt++, tweetId});
12     }
13     
14     /** Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. */
15     vector<int> getNewsFeed(int userId) {
16         vector<int> res;
17         map<int, int> top10;//cnt, tweetId
18         //for(auto fr : friends[userId]){//遍历所有的friends
19         for(auto fr = friends[userId].begin(); fr != friends[userId].end(); fr++){
20             
21             int f = *fr;//fr是指针,指向set中的每一个朋友
22             //f是指针的指针,代表朋友的ID
23             //for(auto tw : tweets[fr]){
24             
25             for(auto tw = tweets[f].begin(); tw != tweets[f].end(); tw++){//tw是指向map(时间点 和 tweetId的映射)的指针
26                 
27                 //if(top10.size() > 10 && top10.first > tw.first) break;//top10的size已达到最大且时间是最新的
28                 if(top10.size() > 10 && top10.begin()->first > tw->first) break;
29                 
30                 top10.insert({tw->first, tw->second});//加入新的tweet, map.insert 也要用{}
31                 
32                 if(top10.size() > 10){
33                     top10.erase(top10.begin());//因为用的是map 所以自动排序 只需删除头
34                 }
35                 
36             }
37         }
38         /*
39         for(auto t : top10){
40             res.push_back(t.second);//把tweet加入结果
41         }*///应该从后往前 t++
42         for(auto t = top10.rbegin(); t != top10.rend(); t++){
43             res.push_back(t -> second);//begin()是指针
44         }
45         return res;
46     }
47     
48     /** Follower follows a followee. If the operation is invalid, it should be a no-op. */
49     void follow(int followerId, int followeeId) {
50         friends[followerId].insert(followeeId);
51     }
52     
53     /** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
54     void unfollow(int followerId, int followeeId) {
55         if(followerId != followeeId){
56             friends[followerId].erase(followeeId);
57         }
58         //friends[followerId].erase(followeeId);
59     }
60     
61 private:
62     int cnt;//时间点 越大越新
63     unordered_map<int, set<int>> friends;//userId, userId
64     unordered_map<int, map<int, int>> tweets;//userId, cnt, tweetId
65 };
66 
67 /**
68  * Your Twitter object will be instantiated and called as such:
69  * Twitter obj = new Twitter();
70  * obj.postTweet(userId,tweetId);
71  * vector<int> param_2 = obj.getNewsFeed(userId);
72  * obj.follow(followerId,followeeId);
73  * obj.unfollow(followerId,followeeId);
74  */

 

posted @ 2017-02-09 13:45  会咬人的兔子  阅读(158)  评论(0编辑  收藏  举报