题目描述:

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:

  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.

题目分析:

这是一道实现具体类的题目,一般来说这样的题只要理解每个方法的具体用法就不难做出。在这道题目中,需要一个发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的更多相关文章

  1. 【LeetCode】355. Design Twitter 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  2. 【LeetCode】1166. Design File System 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 目录树 日期 题目地址https://leetc ...

  3. 【LeetCode】641. Design Circular Deque 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/design-ci ...

  4. 【LeetCode】622. Design Circular Queue 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 用直的代替弯的 数组循环利用 日期 题目地址:htt ...

  5. 【LeetCode】707. Design Linked List 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. 【LeetCode】706. Design HashMap 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode】705. Design HashSet 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 位图法 数组法 日期 题目地址:https://le ...

  8. 【leetcode】1244. Design A Leaderboard

    题目如下: Design a Leaderboard class, which has 3 functions: addScore(playerId, score): Update the leade ...

  9. 【leetcode】622. Design Circular Queue

    题目如下: Design your implementation of the circular queue. The circular queue is a linear data structur ...

随机推荐

  1. CDOJ 481 Apparent Magnitude 水题

    Apparent Magnitude Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/sh ...

  2. ios开发——实用技术篇Swift篇&录音

    录音 // MARK: - 录音 /*----- 录音 ------*/ var recorder:AVAudioRecorder? //录音器 var player:AVAudioPlayer? / ...

  3. ios开发——面试篇C语言精华

    面试篇C语言精华    1.面向过程:分析解决问题所需要的步骤,然后用函数把这些步骤一步一步实 现. 面向对象:直接描述客观世界的对象及其相互关系.现实世界中任何实体都 可以看作是对象,对象之间通过消 ...

  4. c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)

    在java/C#中都有类的反射,而C下是不存在的. java/C#中能够把表设计成类.而C下仅仅能设计成结构体形式. 在java中有hibernate来操作数据库,可是在C以下怎么设计好呢? 如今,我 ...

  5. js 控制div 显示隐藏的问题

    var divs = document.getElementsByTagName("div");得到所有的divfor(var i=0;i<divs.length;i++){ ...

  6. Spring MVC 接收Json格式参数

    今天做了一个关于表格排序的功能,可以通过右边的箭头做排序操作,每次操作需要通过Ajax将每条记录的Id数组作为参数去发送请求, 后台Spring MVC接到参数后作更改序号操作. 前端页面发送请求的代 ...

  7. 关于使用NotificationComat导致android2.3及以下版本无法显示自定义布局的解决方法.

    大伙都知道 android-support-v4为我们提供了很多兼容的解决方案, 其中就有关于通知栏的. NotificationCompat, 顺利成章操刀显示通知. eg: Intent inte ...

  8. Qt之遍历文件夹

    关于Qt操作文件夹.文件的知识用途较多,比如遍历下一层乃至所有子孙文件.文件夹,获取它们的一些信息(大小.类型.最后更改时间等).当然,也可以进行级联删除.     首先看简单的:   一.Qt遍历文 ...

  9. Linux 学习笔记 Linux环境变量初稿

    set命令会显示为某个特定进程设置的所有环境变量,但不包括一些没有设置值的默认环境变量 可以通过等号来给环境变量赋值,值可以是数值或字符串 如果要给变量赋一个含有空格的字符串值,必需用单引号来界定字符 ...

  10. 小白日记6:kali渗透测试之被动信息收集(五)-Recon-ng

    Recon-ng Recon-NG是由python编写的一个开源的Web侦查(信息收集)框架.Recon-ng框架是一个全特性的工具,使用它可以自动的收集信息和网络侦查.其命令格式与Metasploi ...