【Leetcode】355. Design Twitter
题目描述:
Design a simplified version of Twitter where users can post tweets, follow/unfollow another user and is able to see the 10 most recent tweets in the user's news feed. Your design should support the following methods:
- postTweet(userId, tweetId): Compose a new tweet.
- 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.
- follow(followerId, followeeId): Follower follows a followee.
- unfollow(followerId, followeeId): Follower unfollows a followee.
题目分析:
这是一道实现具体类的题目,一般来说这样的题只要理解每个方法的具体用法就不难做出。在这道题目中,需要一个发twitter的方法,需要一个加关注和一个取消关注的方法,以及一个浏览twitter的方法。所以我们需要在类中有一个保存userId和他发送的所有twitter的关系的Map,以及userId和他所关注的其他userid的关系的Map。浏览twitter时只要找到用户自己发的twitter,和通过自己所关注的人所发的twitter,并从中选取出10条最近发送的即可。
这道题我在实现的时候花了比较长的时间,主要有两点没有注意到:
1.list的addAll()方法不能参数不能为null,否则会报错。
2.twitterId并不代表发送顺序,需要自己设置一个表示发送顺序的时间戳。
注意到以上两点,这个题就不难解决。
具体代码:
public class Twitter {
private static int order=0;
private Map<Integer,Set<Message>> messages;
private Map<Integer,Set<Integer>> followers;
/** Initialize your data structure here. */
public Twitter() {
messages = new HashMap<Integer,Set<Message>>();
followers = new HashMap<Integer,Set<Integer>>();
}
/** Compose a new tweet. */
public void postTweet(int userId, int tweetId) {
Message m = new Message(userId,tweetId,order++);
Set<Message> set=messages.getOrDefault(userId, new HashSet<Message>());
set.add(m);
messages.put(userId, set);
}
/** 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. */
public List<Integer> getNewsFeed(int userId) {
List<Message> sets = new ArrayList<Message>();
//userId发布的消息
Set<Message> set = messages.getOrDefault(userId, new HashSet<Message>());
sets.addAll(set);
//找出他所关注的人发布的消息
Set<Integer> follow = followers.get(userId);
if(follow!=null){
for(int i:follow){
set=messages.getOrDefault(i, new HashSet<Message>());
sets.addAll(set);
}
}
//对找出的消息进行排序,并找出最近翻出的10条返回
List<Integer> result=new ArrayList<Integer>();
Compare c =new Compare();
sets.sort(c);
for(int i=0;i<sets.size()&&i<10;i++){
Message m=sets.get(i);
result.add(m.twitterId);
}
return result;
}
/** Follower follows a followee. If the operation is invalid, it should be a no-op. */
public void follow(int followerId, int followeeId) {
if(followeeId==followerId)
return;
Set<Integer> set = followers.getOrDefault(followerId, new HashSet<Integer>());
set.add(followeeId);
followers.put(followerId, set);
}
/** 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;
if(!followers.containsKey(followerId)){
;
}
else{
Set<Integer> set = followers.get(followerId);
set.remove(followeeId);
//如果userid的用户已经没有关注的人,讲他的记录从map中删除掉
if(set.size()==0){
followers.remove(followerId);
}
else{
followers.put(followerId, set);
}
}
}
}
//封装一条twitter的类
class Message{
int userId;
int twitterId;
int order;
public Message(int userId, int twitterId,int order) {
super();
this.userId = userId;
this.twitterId = twitterId;
this.order=order;
}
}
//对消息进行排序的比较器
class Compare implements Comparator<Message>{
@Override
public int compare(Message m1, Message m2) {
// TODO Auto-generated method stub
if(m1.order>m2.order)
return -1;
else if(m1.order<m2.order)
return 1;
else
return 0;
}
}
【Leetcode】355. Design Twitter的更多相关文章
- 【LeetCode】355. Design Twitter 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】1166. Design File System 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 目录树 日期 题目地址https://leetc ...
- 【LeetCode】641. Design Circular Deque 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/design-ci ...
- 【LeetCode】622. Design Circular Queue 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 用直的代替弯的 数组循环利用 日期 题目地址:htt ...
- 【LeetCode】707. Design Linked List 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】706. Design HashMap 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】705. Design HashSet 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 位图法 数组法 日期 题目地址:https://le ...
- 【leetcode】1244. Design A Leaderboard
题目如下: Design a Leaderboard class, which has 3 functions: addScore(playerId, score): Update the leade ...
- 【leetcode】622. Design Circular Queue
题目如下: Design your implementation of the circular queue. The circular queue is a linear data structur ...
随机推荐
- Ectouch修改虚拟销售数量的方法
1.参考:http://zhidao.baidu.com/link?url=5OEkRlKqtRcmnO6iyW2pq-gw1aj-1S6QdImmBkQZHHt6tcvT50aIf_1nibP3T6 ...
- codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点
J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(二)
一.Servlet之Request Web服务器会对收到的每一次客户端http请求分别创建一个用于代表请求的request对象和代表响应的response对象.要获取客户端提交的数据需 ...
- WWDC2015—图解
- Android 事件监听处理
事件监听的处理模型包括三个成员:事件源.事件以及事件监听器. 基于监听的事件处理模型一般包括几个步骤: 1.获取普通界面组件: 2.实现事件监听器类 3.将监听器对象注冊给普通组件 当事件源上发生指定 ...
- java_线程安全-service
package com.demo.test; import java.util.Collections; import java.util.HashMap; import java.util.Map; ...
- 为laravel分页样式制定class
做的项目有一个上翻页和下翻页,使用了框架提供的
- cocos2dx新建android项目lib拷贝、访问权限等问题集
win7上面搭建cocos2dx的android项目,用create-android-project.bat新建一个项目时,出现了访问权限和项目无lib的问题. 解决方案: 1.项目无lib问题. 当 ...
- 网站安全通用防护代码(C#版本源码提供)
每一个开发者都会意识到,网站发布之前,需要进行安全检查. 那么如何拦截攻击者注入恶意代码?如何防御诸如跨站脚本攻击(XSS).SQL注入攻击等恶意攻击行为? 针对目前常见的一些安全问题,结合目前一些常 ...