355. 设计推特

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

实现 Twitter 类:

Twitter() 初始化简易版推特对象
void postTweet(int userId, int tweetId) 根据给定的 tweetId 和 userId 创建一条新推文。每次调用此函数都会使用一个不同的 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 的用户。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-twitter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.*;

class Twitter {

    private static class Person {
        Set<Integer> followees;
        Deque<Integer> tweets;

        public Person() {
            this.followees = new HashSet<>();
            this.tweets = new LinkedList<>();
        }
    }

    private static class TwitterInfo {
        int id;
        int postTime;

        public TwitterInfo(int id, int postTime) {
            this.id = id;
            this.postTime = postTime;
        }
    }

    private static class TwitterInfoComparator implements Comparator<TwitterInfo> {

        @Override
        public int compare(TwitterInfo o1, TwitterInfo o2) {
            return Integer.compare(o1.postTime, o2.postTime);
        }
    }

    private int index;

    private int limit;

    private TwitterInfoComparator twitterInfoComparator;

    private Map<Integer, Person> users;

    private Map<Integer, TwitterInfo> twitterInfos;


    public Twitter() {
        this.index = 0;
        this.limit = 10;
        this.twitterInfoComparator = new TwitterInfoComparator();
        this.users = new HashMap<>();
        this.twitterInfos = new HashMap<>();
    }

    private void initUser(int userId) {
        if (!users.containsKey(userId)) {
            users.put(userId, new Person());
        }
    }

    public void postTweet(int userId, int tweetId) {
        initUser(userId);
        twitterInfos.put(tweetId, new TwitterInfo(tweetId, this.index++));
        Deque<Integer> tweets = users.get(userId).tweets;
        if (tweets.size() == limit) {
            tweets.pollLast();
        }
        tweets.offerFirst(tweetId);
    }

    public List<Integer> getNewsFeed(int userId) {
        initUser(userId);
        PriorityQueue<TwitterInfo> queue = new PriorityQueue<>(twitterInfoComparator);
        HashSet<Integer> userSet = new HashSet<>(users.get(userId).followees);
        userSet.add(userId);

        for (Integer user : userSet) {
            Deque<Integer> tweets = users.get(user).tweets;
            for (Integer tweetId : tweets) {
                TwitterInfo twitterInfo = twitterInfos.get(tweetId);
                if (queue.size() < limit) {
                    queue.offer(twitterInfo);
                } else {
                    if (twitterInfoComparator.compare(queue.peek(), twitterInfo) < 0) {
                        queue.poll();
                        queue.offer(twitterInfo);
                    }
                }
            }
        }

        Integer[] ans = new Integer[queue.size()];

        for (int i = ans.length - 1; i >= 0; --i) {
            ans[i] = queue.poll().id;
        }
        return Arrays.asList(ans);
    }

    public void follow(int followerId, int followeeId) {
        initUser(followerId);
        initUser(followeeId);
        users.get(followerId).followees.add(followeeId);
    }

    public void unfollow(int followerId, int followeeId) {
        initUser(followerId);
        initUser(followeeId);
        users.get(followerId).followees.remove(followeeId);
    }
}

/**
 * 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);
 */
posted @   Tianyiya  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示