当前位置: 首页 > news >正文

Java | Leetcode Java题解之第355题设计推特

题目:

题解:

class Twitter {private class Node {// 哈希表存储关注人的 IdSet<Integer> followee;// 用链表存储 tweetIdLinkedList<Integer> tweet;Node() {followee = new HashSet<Integer>();tweet = new LinkedList<Integer>();}}// getNewsFeed 检索的推文的上限以及 tweetId 的时间戳private int recentMax, time;// tweetId 对应发送的时间private Map<Integer, Integer> tweetTime;// 每个用户存储的信息private Map<Integer, Node> user;public Twitter() {time = 0;recentMax = 10;tweetTime = new HashMap<Integer, Integer>();user = new HashMap<Integer, Node>();}// 初始化public void init(int userId) {user.put(userId, new Node());}public void postTweet(int userId, int tweetId) {if (!user.containsKey(userId)) {init(userId);}// 达到限制,剔除链表末尾元素if (user.get(userId).tweet.size() == recentMax) {user.get(userId).tweet.remove(recentMax - 1);}user.get(userId).tweet.addFirst(tweetId);tweetTime.put(tweetId, ++time);}public List<Integer> getNewsFeed(int userId) {LinkedList<Integer> ans = new LinkedList<Integer>();for (int it : user.getOrDefault(userId, new Node()).tweet) {ans.addLast(it);}for (int followeeId : user.getOrDefault(userId, new Node()).followee) {if (followeeId == userId) { // 可能出现自己关注自己的情况continue;}LinkedList<Integer> res = new LinkedList<Integer>();int tweetSize = user.get(followeeId).tweet.size();Iterator<Integer> it = user.get(followeeId).tweet.iterator();int i = 0;int j = 0;int curr = -1;// 线性归并if (j < tweetSize) {curr = it.next();while (i < ans.size() && j < tweetSize) {if (tweetTime.get(curr) > tweetTime.get(ans.get(i))) {res.addLast(curr);++j;if (it.hasNext()) {curr = it.next();}} else {res.addLast(ans.get(i));++i;}// 已经找到这两个链表合起来后最近的 recentMax 条推文if (res.size() == recentMax) {break;}}}for (; i < ans.size() && res.size() < recentMax; ++i) {res.addLast(ans.get(i));}if (j < tweetSize && res.size() < recentMax) {res.addLast(curr);for (; it.hasNext() && res.size() < recentMax;) {res.addLast(it.next());}}ans = new LinkedList<Integer>(res);}return ans;}public void follow(int followerId, int followeeId) {if (!user.containsKey(followerId)) {init(followerId);}if (!user.containsKey(followeeId)) {init(followeeId);}user.get(followerId).followee.add(followeeId);}public void unfollow(int followerId, int followeeId) {user.getOrDefault(followerId, new Node()).followee.remove(followeeId);}
}

http://www.mrgr.cn/news/8437.html

相关文章:

  • 靠近光,学习光,成为光
  • m4a格式音频怎么转成mp3?音频转成mp3的8个方法
  • 基于Spark实现大数据量的Node2Vec
  • 【非常简单】 猿人学web第一届 第12题 入门级js
  • http连接未释放导致生产故障
  • 【模板方法】设计模式:构建可扩展软件的基石
  • JetBrains Rider 2024.2 (macOS, Linux, Windows) - 快速且强大的跨平台 .NET IDE
  • SpringCache源码解析(一)
  • 使用 Tailwind CSS 实现水平和垂直居中对齐的方法
  • 【学习笔记】NTN技术整理
  • Objective-C 动态调用秘籍:NSInvocation 的魔法
  • Mako 模板语言
  • (南京观海微电子)——直流电源使用介绍
  • 基于Python的网易民谣歌词数据分析的设计与实现
  • 广州网站制作seo优化技巧
  • C语言01 每日一练01
  • 模型 FIRE沟通法
  • 混合A*算法
  • SpringBoot集成kafka接收消息
  • 在网易云音乐服务器故障事件中提升应急处理能力的探讨