LintCode-501: Design-Twitter (经典系统设计题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/roufoo/article/details/81144726

第一次做系统题,不知道思路。直接参考答案。做完收获也不少。
最重要的一点是在设计getTen()时,一定要从order逆序找出order最大的那10条,这样才能说是最近的10条tweet。

/**
 * Definition of Tweet:
 * class Tweet {
 * public:
 *     int id;
 *     int user_id;
 *     String text;
 *     static Tweet create(int user_id, string tweet_text) {
 *         // This will create a new tweet object,
 *         // and auto fill id
 *     }
 * }
 */

class Node {
public: 
    Tweet tweetEntry;
    Node(int ord, Tweet tweet) : order(ord), tweetEntry(tweet) {}
    bool operator < (const Node & o) const {
        return order > o.order;
    }
private:
    int order;
};

class MiniTwitter {
public:
    MiniTwitter() {
        // do intialization if necessary
        friends.clear();
        users_tweets.clear();
        order = 0;
    }

    /*
     * @param user_id: An integer
     * @param tweet_text: a string
     * @return: a tweet
     */
     Tweet postTweet(int user_id, string &tweet_text) {
        Tweet tweet = Tweet::create(user_id, tweet_text);
        if (users_tweets.find(user_id) == users_tweets.end()) {
            users_tweets[user_id] = vector<Node>();
        }
        users_tweets[user_id].push_back(Node(++order, tweet));
        return tweet;
    }

    /*
     * @param user_id: An integer
     * @return: a list of 10 new feeds recently and sort by timeline
     */
    vector<Tweet> getNewsFeed(int user_id) {
        vector<Node> allRecords; //including tweets from the user and his friends
        //if the user exists in the system
        if (users_tweets.find(user_id) != users_tweets.end()) {

            allRecords = getTen(users_tweets[user_id]);
        }
        //if the user has friends
        if (friends.find(user_id) != friends.end()) {
            for (auto friend_id : friends[user_id]) {
                if (users_tweets.find(friend_id) != users_tweets.end()) {
                    vector<Node> friendRecords = getTen(users_tweets[friend_id]);
                    allRecords.insert(allRecords.end(), friendRecords.begin(), friendRecords.end());
                }
            }
        }

        sort(allRecords.begin(), allRecords.end());
        vector<Tweet> newsFeed;
        int recordSize = allRecords.size();
        recordSize = min(10, recordSize);
        for (int i = 0; i < recordSize; ++i) {

            newsFeed.push_back(allRecords[i].tweetEntry);
        }
        return newsFeed;
    }

    /*
     * @param user_id: An integer
     * @return: a list of 10 new posts recently and sort by timeline
     */
    vector<Tweet> getTimeline(int user_id) {

        vector<Tweet> timeLine;
        if (users_tweets.find(user_id) == users_tweets.end()) {

            return timeLine;
        }

        vector<Node> userRecords = getTen(users_tweets[user_id]);
        sort(userRecords.begin(), userRecords.end());

        int recordsSize = userRecords.size();
        recordsSize = min(10, recordsSize);
        for (int i = 0; i < recordsSize; ++i) {

            timeLine.push_back(userRecords[i].tweetEntry);
        }

        return timeLine;
    }

    /*
     * @param from_user_id: An integer
     * @param to_user_id: An integer
     * @return: nothing
     */
    void follow(int from_user_id, int to_user_id) {

        if (friends.find(from_user_id) == friends.end()) {

            friends[from_user_id] = set<int>();
        }
        friends[from_user_id].insert(to_user_id);
    }

    /*
     * @param from_user_id: An integer
     * @param to_user_id: An integer
     * @return: nothing
     */
    void unfollow(int from_user_id, int to_user_id) {

        if (friends.find(from_user_id) != friends.end()) {

            friends[from_user_id].erase(to_user_id);
        }
    }

private:
    vector<Node> getTen(vector<Node> &records) {
        vector<Node> tenRecords;
        int recordSize = records.size();
        int count = 0;
        for (int i = recordSize - 1; i >= 0; --i) {    
            count++;
            tenRecords.push_back(records[i]);
            if (count == 10) break;
        }
        return tenRecords;
    }

    map<int, set<int>> friends;
    map<int, vector<Node>> users_tweets;
    int order;
};

猜你喜欢

转载自blog.csdn.net/roufoo/article/details/81144726
今日推荐