跳到主要内容

355.设计推特

链接:355.设计推特
难度:Medium
标签:设计、哈希表、链表、堆(优先队列)
简介:设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。

题解 1 - javascript

  • 编辑时间:2020-04-13
  • 执行用时:152ms
  • 内存消耗:46.8MB
  • 编程语言:javascript
  • 解法介绍:难点在于自己关注自己的情况和自己取关自己。
let count = 0;
class Tweet {
constructor(id) {
this.id = id;
this.time = count++;
}
}
class User {
followSet = new Set();
tweet = new Set();
constructor() {}
postTweet(tweetId) {
this.tweet.add(new Tweet(tweetId));
}
follow(followeeUser) {
this.followSet.add(followeeUser);
}
unFollow(followeeUser) {
if (this.followSet.has(followeeUser)) {
this.followSet.delete(followeeUser);
}
}
getNewsFeed() {
let arr = [...this.tweet];
for (const user of this.followSet) {
arr = arr.concat([...user.tweet]);
}
return [
...new Set(
arr
.sort((a, b) => b.time - a.time)
.map(v => v.id)
.filter((_, index) => index < 10)
),
];
}
}
class Twitter {
user = {};
/**
* Compose a new tweet.
* @param {number} userId
* @param {number} tweetId
* @return {void}
*/
postTweet(userId, tweetId) {
const user = this.user[userId];
if (user) {
user.postTweet(tweetId);
} else {
const newUser = new User();
newUser.postTweet(tweetId);
this.user[userId] = newUser;
}
}
/**
* Follower follows a followee. If the operation is invalid, it should be a no-op.
* @param {number} followerId
* @param {number} followeeId
* @return {void}
*/
follow(followerId, followeeId) {
if (followerId === followeeId) return;
let followerUser = this.user[followerId];
let followeeUser = this.user[followeeId];
if (!followerUser) this.user[followerId] = followerUser = new User();
if (!followeeUser) this.user[followeeId] = followeeUser = new User();
followerUser.follow(followeeUser);
}
/**
* Follower unfollows a followee. If the operation is invalid, it should be a no-op.
* @param {number} followerId
* @param {number} followeeId
* @return {void}
*/
unfollow(followerId, followeeId) {
const followerUser = this.user[followerId];
const followeeUser = this.user[followeeId];
if (followerUser && followeeUser) {
followerUser.unFollow(followeeUser);
}
}
/**
* 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.
* @param {number} userId
* @return {number[]}
*/
getNewsFeed(userId) {
const user = this.user[userId];
if (user) {
return user.getNewsFeed();
} else {
return [];
}
}
}