设计Twitter的api

355. Design Twitter

题意:设计Twitter的API,实现以下功能。

  1. postTweet(userId, tweetId): Compose a new tweet.
  2. getNewsFeed(userId): Retrieve the 10 most recent tweet ids in the user‘s 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.
  3. follow(followerId, followeeId): Follower follows a followee.
  4. unfollow(followerId, followeeId): Follower unfollows a followee.

Example:

Twitter twitter = new Twitter();

// User 1 posts a new tweet (id = 5).
twitter.postTweet(1, 5);

// User 1‘s news feed should return a list with 1 tweet id -> [5].
twitter.getNewsFeed(1);

// User 1 follows user 2.
twitter.follow(1, 2);

// User 2 posts a new tweet (id = 6).
twitter.postTweet(2, 6);

// User 1‘s news feed should return a list with 2 tweet ids -> [6, 5].
// Tweet id 6 should precede tweet id 5 because it is posted after tweet id 5.
twitter.getNewsFeed(1);

// User 1 unfollows user 2.
twitter.unfollow(1, 2);

// User 1‘s news feed should return a list with 1 tweet id -> [5],
// since user 1 is no longer following user 2.
twitter.getNewsFeed(1);

以下是我的实现代码

大致思路:全局的信息队列,按发布时间排序。全局的用户映射表,存用户信息,设计成hash表结构,便于快速获取用户。

 1 public class Twitter {
 2
 3     class User implements Comparable<User>{
 4         int userId;
 5         List<User> followers;
 6         List<User> followees;
 7         User(int userId) {
 8             this.userId = userId;
 9             this.followers = new LinkedList<>();
10             this.followees = new LinkedList<>();
11         }
12         public int compareTo(User o){
13             return userId-o.userId;
14         }
15     }
16
17     class Message{
18         int userId;
19         int messageId;
20         Message(int userId, int messageId){
21             this.userId = userId;
22             this.messageId = messageId;
23         }
24     }
25
26     private List<Message> messages;
27     private Map<Integer, User> users;
28
29     /** Initialize your data structure here. */
30     public Twitter() {
31         messages = new LinkedList<>();
32         users = new HashMap<>();
33     }
34
35     /** Compose a new tweet. */
36     public void postTweet(int userId, int tweetId) {
37
38         if(!users.containsKey(userId)){
39             User u = new User(userId);
40             users.put(userId,u);
41         }
42
43         Message m = new Message(userId, tweetId);
44         messages.add(0, m);
45     }
46
47     /** Retrieve the 10 most recent tweet ids in the user‘s 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. */
48     public List<Integer> getNewsFeed(int userId) {
49         List<Integer> newMessages = new ArrayList<>();
50         Set<Integer> all = new HashSet<>();
51         all.add(userId);
52         if(users.containsKey(userId)) {
53             for (User u : users.get(userId).followees) {
54                 all.add(u.userId);
55             }
56         }
57         int i=0;
58         for(Message m : messages){
59             if(all.contains(m.userId)){
60                 newMessages.add(m.messageId);
61                 i++;
62                 if(i==10) break;
63             }
64         }
65
66         return  newMessages;
67     }
68
69     /** Follower follows a followee. If the operation is invalid, it should be a no-op. */
70     public void follow(int followerId, int followeeId) {
71         User u1;
72         User u2;
73         if(users.containsKey(followerId)){
74             u1 = users.get(followerId);
75         }else{
76             u1 = new User(followerId);
77         }
78
79         if(users.containsKey(followeeId)){
80             u2 = users.get(followeeId);
81         }else{
82             u2 = new User(followeeId);
83         }
84         u1.followees.add(u2);
85         u2.followers.add(u1);
86         users.put(followerId, u1);
87         users.put(followeeId, u2);
88     }
89
90     /** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
91     public void unfollow(int followerId, int followeeId) {
92         User u1 = users.get(followerId);
93         User u2 = users.get(followeeId);
94         if(u1!=null)
95             u1.followees.remove(u2);
96         if(u2!=null)
97             u2.followers.remove(u1);
98     }
99 }
时间: 2024-10-12 04:58:45

设计Twitter的api的相关文章

ATITIT.翻译模块的设计与实现&#160;api&#160;attilax&#160;总结

ATITIT.翻译模块的设计与实现 api attilax 总结 1. 翻译原理1 2. TMX格式是国际通用格式(xml)1 2.1. 方法/步骤2 3. TRADOS2 4. ATITIT.翻译软件的实现思路2 5. 参考3 1. 翻译原理 在日常生活中英汉辞典的作用就是把中文翻译成英文或者是把英文翻译成中文,它的实现原理就是词典库里先把对应的中文和英文存在数据库表里,然后根据你输入的内容来匹配出相应的结果出来. 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[email pr

Atitit.论图片类型&#160;垃圾文件的识别与清理&#160;&#160;流程与设计原则&#160;与api概要设计&#160;v2&#160;pbj

Atitit.论图片类型 垃圾文件的识别与清理  流程与设计原则 与api概要设计 v2 pbj 1. 俩个问题::识别垃圾文件与清理策略1 2. 如何识别垃圾图片1 2.1. 体积过小文件<10kb1 2.2. 增加扩展名对于无扩展名文件1 2.3. 清理非图片(bmp,jpg,jpeg,png)的文件2 2.4. 尺寸过小图片(210*150)2 2.5. 清理广告图片(高度宽度不成比例)超长超宽图片2 2.6. 清理重复图片(此结果不能加入指纹库)2 2.7. 非本类别的图片(人工识别)2

如何设计优秀的API(转)

到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的.一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的打击就更大.如果API经常发生变化,用户就会失去对提供方失去信心,从而也会影响目前的业务. 但是我们为什么还要修改API呢?为了API看起来更加漂亮?为了提

SoC嵌入式软件架构设计之六:API设计方法

在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,例如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每个模块又有多个接口,例如LCD驱动有光标定位.画点.画直线等,而文件系统有fread.fwrite.fseek.fopen等接口.以下举例将以文件系统的fopen为例,工具链为mips. 一.API设计方法 1. 驱动接口声明:extern FILE * fopen(const char * pat

队列顺序存储 - 设计与实现 - API函数

队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不同意在中间部位进行操作! queue经常使用操作 销毁队列 清空队列 进队列 出队列 获取队头元素 获取队列的长度 队列也是一种特殊的线性表:能够用线性表顺序存储来模拟队列. 主要代码: // seqqueue.h // 顺序存储队列API声明 #ifndef _MY_SEQQUEUE_H_ #define _MY_SEQQUEUE_H_ typedef vo

队列链式存储 - 设计与实现 - API函数

队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式存储API声明 #ifndef _LINKQUEUE_H_ #define _LINKQUEUE_H_ typedef void LinkQueue; // 创建队列 LinkQueue* LinkQueue_Create(); // 销毁队列 void LinkQueue_Destroy(Link

OAuth 2和JWT - 如何设计安全的API?

OAuth 2和JWT - 如何设计安全的API? Moakap译,原文 OAuth 2 VS JSON Web Tokens: How to secure an API 本文会详细描述两种通用的保证API安全性的方法:OAuth2和JSON Web Token (JWT) 假设: 你已经或者正在实现API: 你正在考虑选择一个合适的方法保证API的安全性: JWT和OAuth2比较? 要比较JWT和OAuth2?首先要明白一点就是,这两个根本没有可比性,是两个完全不同的东西. JWT是一种认证

前阿里P8架构师谈如何设计优秀的API

随着大数据.公共平台等互联网技术的日益成熟,API接口的重要性日益凸显,从公司的角度来看,API可以算作是公司一笔巨大的资产,公共API可以捕获用户.为公司做出许多贡献.对于个人来说,只要你编程,你就是一个API设计者,因为好的代码即是模块--每个模块便是一个API,而好的模块会被多次使用.此外,编写API还有利于开发者提高代码质量,提高自身的编码水平. 优秀API所具备的特征: 简单易学: 易于使用,即使没有文档: 很难误用: 易于阅读,代码易于维护: 足够强大,可以满足需求: 易于扩展: 适

SoC嵌入式软件架构设计之六 :API设计方法

在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,例如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每个模块又有多个接口,例如LCD驱动有光标定位.画点.画直线等,而文件系统有fread.fwrite.fseek.fopen等接口.以下举例将以文件系统的fopen为例,工具链为mips. 一.API设计方法 1. 驱动接口声明:extern FILE * fopen(const char * pat