1、leetcode 力扣 355 设计推特 题解 算法题题目:设计推特设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 10 条推文。实现 Twitter 类:Twitter() 初始化简易版推特对象void postTweet(int userId, int tweetId) 根据给定的 tweetId 和 userId 创建一条新推文。每次调用此函数都会使用一个不同的 tweetId 。List getNewsFeed(int userId) 检索当前用户新闻推送中最近 10 条推文的 ID 。新闻推送中的每一项都必须是
2、由用户关注的人或者是用户自己发布的推文。推文必须 按照时间顺序由最近到最远排序 。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, g
3、etNewsFeed, 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 关注了用户 2twitter.postTweet(2,
4、 6); / 用户 2 发送了一个新推文 (推文 id = 6)twitter.getNewsFeed(1); / 用户 1 的获取推文应当返回一个列表,其中包含两个推文,id 分别为 - 6, 5 。推文 id 6 应当在推文 id 5 之前,因为它是在 5 之后发送的twitter.unfollow(1, 2); / 用户 1 取消关注了用户 2twitter.getNewsFeed(1); / 用户 1 获取推文应当返回一个列表,其中包含一个 id 为 5 的推文。因为用户 1 已经不再关注用户 2提示:1 = userId, followerId, followeeId = 5000
5、= tweetId = 104所有推特的 ID 都互不相同postTweet、getNewsFeed、follow 和 unfollow 方法最多调用 3 * 104 次语言:C+class Twitter struct Node unordered_set followee; / 用链表存储 tweetId list tweet; ; / getNewsFeed 检索的推文的上限以及 tweetId 的时间戳 int recentMax, time; / tweetId 对应发送的时间 unordered_map tweetTime; / 每个用户存储的信息 unordered_map us
6、er;public: Twitter() time = 0; recentMax = 10; user.clear(); / 初始化 void init(int userId) useruserId.followee.clear(); useruserId.tweet.clear(); void postTweet(int userId, int tweetId) if (user.find(userId) = user.end() init(userId); / 达到限制,剔除链表末尾元素 if (useruserId.tweet.size() = recentMax) useruserId
7、.tweet.pop_back(); useruserId.tweet.push_front(tweetId); tweetTimetweetId = +time; vector getNewsFeed(int userId) vector ans; ans.clear(); for (list:iterator it = useruserId.tweet.begin(); it != useruserId.tweet.end(); +it) ans.emplace_back(*it); for (int followeeId: useruserId.followee) vector res;
8、 res.clear(); list:iterator it = userfolloweeId.tweet.begin(); int i = 0; / 线性归并 while (i tweetTimeansi) res.emplace_back(*it); +it; else res.emplace_back(ansi); +i; / 已经找到这两个链表合起来后最近的 recentMax 条推文 if (int)res.size() = recentMax) break; for (; i (int)ans.size() & (int)res.size() recentMax; +i) res.
9、emplace_back(ansi); for (; it != userfolloweeId.tweet.end() & (int)res.size() recentMax; +it) res.emplace_back(*it); ans.assign(res.begin(),res.end(); return ans; void follow(int followerId, int followeeId) if (user.find(followerId) = user.end() init(followerId); if (user.find(followeeId) = user.end
10、() init(followeeId); userfollowerId.followee.insert(followeeId); void unfollow(int followerId, int followeeId) userfollowerId.followee.erase(followeeId); ;语言:Javaclass Twitter private class Node Set followee; / 用链表存储 tweetId LinkedList tweet; Node() followee = new HashSet(); tweet = new LinkedList()
11、; / getNewsFeed 检索的推文的上限以及 tweetId 的时间戳 private int recentMax, time; / tweetId 对应发送的时间 private Map tweetTime; / 每个用户存储的信息 private Map user; public Twitter() time = 0; recentMax = 10; tweetTime = new HashMap(); user = new HashMap(); / 初始化 public void init(int userId) user.put(userId, new Node(); publ
12、ic 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 getNewsFeed(int use
13、rId) LinkedList ans = new LinkedList(); for (int it : user.getOrDefault(userId, new Node().tweet) ans.addLast(it); for (int followeeId : user.getOrDefault(userId, new Node().followee) continue; LinkedList res = new LinkedList(); int tweetSize = user.get(followeeId).tweet.size(); Iterator it = user.g
14、et(followeeId).tweet.iterator(); int i = 0; int j = 0; int curr = -1; / 线性归并 if (j tweetSize) curr = it.next(); while (i ans.size() & j 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()
15、= 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(res); return ans; public void follow(int followerId, int fol
16、loweeId) 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); 语言:Javaimport jav
17、a.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.PriorityQueue;import java.util.Set;public class Twitter /* * 用户 id 和推文(单链表)的对应关系 */ private Map twitter; /* */ private MapInteger, Set followings; /* * 全局使用的时间戳字段,用户每发布一条推文之
18、前 + 1 */ private static int timestamp = 0; /* * 合并 k 组推文使用的数据结构(可以在方法里创建使用),声明成全局变量非必需,视个人情况使用 */ private static PriorityQueue maxHeap; /* * Initialize your data structure here. */ public Twitter() followings = new HashMap(); twitter = new HashMap(); maxHeap = new PriorityQueue(o1, o2) - -o1.timesta
19、mp + o2.timestamp); /* * Compose a new tweet. */ public void postTweet(int userId, int tweetId) timestamp+; if (twitter.containsKey(userId) Tweet oldHead = twitter.get(userId); Tweet newHead = new Tweet(tweetId, timestamp); newHead.next = oldHead; twitter.put(userId, newHead); else twitter.put(userI
20、d, new Tweet(tweetId, timestamp); /* * Retrieve the 10 most recent tweet ids in the users news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. */ public List getNewsFeed(int userId) / 由于是全
21、局使用的,使用之前需要清空 maxHeap.clear(); / 如果自己发了推文也要算上 if (twitter.containsKey(userId) maxHeap.offer(twitter.get(userId); Set followingList = followings.get(userId); if (followingList != null & followingList.size() 0) for (Integer followingId : followingList) Tweet tweet = twitter.get(followingId); if (tweet
22、 != null) maxHeap.offer(tweet); List res = new ArrayList(10); int count = 0; while (!maxHeap.isEmpty() & count 10) Tweet head = maxHeap.poll(); res.add(head.id); / 这里最好的操作应该是 replace,但是 Java 没有提供 if (head.next != null) maxHeap.offer(head.next); count+; return res; /* * Follower follows a followee. I
23、f the operation is invalid, it should be a no-op. * */ public void follow(int followerId, int followeeId) if (followeeId = followerId) return; Set followingList = followings.get(followerId); if (followingList = null) Set init = new HashSet(); init.add(followeeId); followings.put(followerId, init); e
24、lse if (followingList.contains(followeeId) return; followingList.add(followeeId); /* * Follower unfollows a followee. If the operation is invalid, it should be a no-op. * */ public void unfollow(int followerId, int followeeId) if (followeeId = followerId) return; Set followingList = followings.get(f
25、ollowerId); if (followingList = null) return; / 这里删除之前无需做判断,因为查找是否存在以后,就可以删除,反正删除之前都要查找 followingList.remove(followeeId); /* * 推文类,是一个单链表(结点视角) */ private class Tweet /* * 推文 id */ private int id; /* * 发推文的时间戳 */ private int timestamp; private Tweet next; public Tweet(int id, int timestamp) this.id
26、= id; this.timestamp = timestamp; public static void main(String args) Twitter twitter = new Twitter(); twitter.postTweet(1, 1); List res1 = twitter.getNewsFeed(1); System.out.println(res1); twitter.follow(2, 1); List res2 = twitter.getNewsFeed(2); System.out.println(res2); twitter.unfollow(2, 1); L
27、ist res3 = twitter.getNewsFeed(2); System.out.println(res3); 语言:Pythonclass Twitter: class Node: def _init_(self): self.followee = set() self.tweet = list() def _init_(self): self.time = 0 self.recentMax = 10 self.tweetTime = dict() self.user = dict() def postTweet(self, userId: int, tweetId: int) - None: if userId not in self.user: self.useruserId = Twitter.Node() self.useruserId.tweet.append(tweetId) self.time += 1 self.tweetTimetweetId = self.time def getNewsFeed(self, userId: int) -
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1