leetcode355. Design Twitter
时间:2022-06-19
本文章向大家介绍leetcode355. 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.
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);
设计一个迷你推特,要求能够支持以下几个方法:发布推特,关注用户,取关用户,查看最近的十条关注用户发送的推特。
思路和代码
这道题目本质上是考察是否能将数据结构的知识灵活的运用于现实生活中。从最直观的想法来看,我们会有一个用户实体,每个用户会记录自己关注的用户的id,以及记录自己发表的所有tweet。这里唯一的难点在于我们如何按照时间顺序获取tweet流。
这么一想,这题其实就转换为如何将N个有序排列的数组汇合成一个有序的数组。这题等价于我们每次都会比较当前所有被关注者发布的最新未读tweet,选出结果后将其插入结果集。这里我们可以利用等价队列帮助我们更快的完成选择的过程。
public class Twitter {
public Twitter() {
users = new HashMap<>();
}
public static int timestamp = 0;
private Map<Integer, User> users;
/** Compose a new tweet. */
public void postTweet(int userId, int tweetId) {
if(!users.containsKey(userId)) {
User user = new User(userId);
users.put(userId, user);
}
User user = users.get(userId);
user.tweet(tweetId);
}
/** 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<Integer> result = new ArrayList<Integer>();
if(!users.containsKey(userId)) {
return result;
}
User user = users.get(userId);
PriorityQueue<Tweet> queue = new PriorityQueue<>(user.followed.size());
for(int followee : user.followed) {
User tmp = users.get(followee);
if(tmp != null && tmp.headTweet != null) {
queue.offer(tmp.headTweet);
}
}
while(!queue.isEmpty() && result.size() < 10) {
Tweet t = queue.poll();
result.add(t.tweetId);
if(t.next != null) {
queue.offer(t.next);
}
}
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(!users.containsKey(followerId)) {
User user = new User(followerId);
users.put(followerId, user);
}
if(!users.containsKey(followeeId)) {
User user = new User(followeeId);
users.put(followeeId, user);
}
User user = users.get(followerId);
user.follow(followeeId);
}
/** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
public void unfollow(int followerId, int followeeId) {
if(!users.containsKey(followerId) || followerId == followeeId) {
return;
}
User user = users.get(followerId);
user.unfollow(followeeId);
}
public static class User{
int userId;
Set<Integer> followed;
Tweet headTweet;
public User(int userId) {
this.userId = userId;
this.followed = new HashSet<>();
follow(userId);
}
public void follow(int userId) {
followed.add(userId);
}
public void unfollow(int userId) {
followed.remove(userId);
}
public void tweet(int tweetId) {
Tweet tweet = new Tweet(tweetId);
tweet.next = headTweet;
headTweet = tweet;
}
}
public static class Tweet implements Comparable<Tweet>{
int tweetId;
Tweet next;
int time;
public Tweet(int tweetId) {
this.tweetId = tweetId;
this.time = timestamp++;
}
@Override
public int compareTo(Tweet o) {
return o.time - this.time;
}
}
}
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
- Gym 100952E&&2015 HIAST Collegiate Programming Contest E. Arrange Teams【DFS+剪枝】
- Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
- Gym 100952G&&2015 HIAST Collegiate Programming Contest G. The jar of divisors【简单博弈】
- Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+
- Gym 100952D&&2015 HIAST Collegiate Programming Contest D. Time to go back【杨辉三角预处理,组合数,dp】
- Gym 100952B&&2015 HIAST Collegiate Programming Contest B. New Job【模拟】
- 51 Nod 1008 N的阶乘 mod P【Java大数乱搞】
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战06】给Agent添加记忆功能
- Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】
- [开源,学习,分享]UWP第三方简书客户端分享
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
- 51 Nod 1057 N的阶乘【Java大数乱搞】
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法