355. 设计推特
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10 条推文。
实现 Twitter 类:
Twitter() 初始化简易版推特对象
void postTweet(int userId, int tweetId) 根据给定的 tweetId 和 userId 创建一条新推文。每次调用此函数都会使用一个不同的 tweetId 。
List
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);
*/
心之所向,素履以往 生如逆旅,一苇以航
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了