lc-355


设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10 条推文。

实现 Twitter 类:

  • Twitter() 初始化简易版推特对象
  • void postTweet(int userId, int tweetId) 根据给定的 tweetIduserId 创建一条新推文。每次调用此函数都会使用一个不同的 tweetId
  • List getNewsFeed(int userId) 检索当前用户新闻推送中最近 10 条推文的 ID 。新闻推送中的每一项都必须是由用户关注的人或者是用户自己发布的推文。推文必须 按照时间顺序由最近到最远排序
  • void follow(int followerId, int followeeId) ID 为 followerId 的用户开始关注 ID 为 followeeId 的用户。
  • void unfollow(int followerId, int followeeId) ID 为 followerId 的用户不再关注 ID 为 followeeId 的用户。

示例:

输入
["Twitter", "postTweet", "getNewsFeed", "follow", "postTweet", "getNewsFeed", "unfollow", "getNewsFeed"]
[[], [1, 5], [1], [1, 2], [2, 6], [1], [1, 2], [1]]
输出
[null, null, [5], null, null, [6, 5], null, [5]]

解释
Twitter twitter = new Twitter();
twitter.postTweet(1, 5); // 用户 1 发送了一条新推文 (用户 id = 1, 推文 id = 5)
twitter.getNewsFeed(1);  // 用户 1 的获取推文应当返回一个列表,其中包含一个 id 为 5 的推文
twitter.follow(1, 2);    // 用户 1 关注了用户 2
twitter.postTweet(2, 6); // 用户 2 发送了一个新推文 (推文 id = 6)
twitter.getNewsFeed(1);  // 用户 1 的获取推文应当返回一个列表,其中包含两个推文,id 分别为 -> [6, 5] 。推文 id 6 应当在推文 id 5 之前,因为它是在 5 之后发送的
twitter.unfollow(1, 2);  // 用户 1 取消关注了用户 2
twitter.getNewsFeed(1);  // 用户 1 获取推文应当返回一个列表,其中包含一个 id 为 5 的推文。因为用户 1 已经不再关注用户 2

提示:

  • 1 <= userId, followerId, followeeId <= 500
  • 0 <= tweetId <= 104
  • 所有推特的 ID 都互不相同
  • postTweetgetNewsFeedfollowunfollow 方法最多调用 3 * 104
import java.util.stream.Collectors;
//leetcode submit region begin(Prohibit modification and deletion)
class Twitter {
    private Map<Integer, List<TweetMsg>> msgMap;
    private Map<Integer, Set<Integer>> followMap;
    private int time = 0;

    public Twitter() {
        this.msgMap = new HashMap<>();
        this.followMap = new HashMap<>();
    }

    public void postTweet(int userId, int tweetId) {
        TweetMsg tweetMsg = new TweetMsg();
        tweetMsg.userId = userId;
        tweetMsg.tweetId = tweetId;
        tweetMsg.time = time;
        this.time++;

        msgMap.putIfAbsent(userId, new ArrayList<>());
        msgMap.get(userId).add(tweetMsg);
    }

    public List<Integer> getNewsFeed(int userId) {
        List<TweetMsg> msgList = new ArrayList<>();

        if (msgMap.containsKey(userId)) {
            msgList.addAll(msgMap.get(userId));
        }

        if (followMap.containsKey(userId)) {
            for (Integer followeeId : followMap.get(userId)) {
                if (msgMap.containsKey(followeeId)) {
                    msgList.addAll(msgMap.get(followeeId));
                }
            }
        }

        List<Integer> reultLst =  msgList.stream().sorted(new Comparator<>() {
            @Override
            public int compare(TweetMsg m1, TweetMsg m2) {
                return m2.time - m1.time;
            }
        }).map(p->p.tweetId).collect(Collectors.toList());
        if (reultLst.size() > 10) {
            return reultLst.subList(0, 10);
        } else {
            return reultLst;
        }
    }

    public void follow(int followerId, int followeeId) {
        followMap.putIfAbsent(followerId, new HashSet<>());
        followMap.get(followerId).add(followeeId);
    }

    public void unfollow(int followerId, int followeeId) {
        if (followMap.containsKey(followerId) && followMap.get(followerId).contains(followeeId)) {
            followMap.get(followerId).remove(new Integer(followeeId));
        }
    }


    class TweetMsg {
        int userId;
        int tweetId;
        int time;
    }
}

/**
 * Your Twitter object will be instantiated and called as such:
 * Twitter obj = new Twitter();
 * obj.postTweet(userId,tweetId);
 * List<Integer> param_2 = obj.getNewsFeed(userId);
 * obj.follow(followerId,followeeId);
 * obj.unfollow(followerId,followeeId);
 */
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !