ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:22.92KB ,
资源ID:6357888      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6357888.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(leetcode 力扣 355 设计推特题解 算法题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

leetcode 力扣 355 设计推特题解 算法题.docx

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