leetcode-355 设计推特

题目描述:设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:

  1. postTweet(userId, tweetId): 创建一条新的推文
  2. getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。
  3. follow(followerId, followeeId): 关注一个用户
  4. unfollow(followerId, followeeId): 取消关注一个用户

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Tweet implements Comparable<Tweet> {
private Integer tweetId;

private Long createTime;

public Tweet(Integer tweetId, Long createTime) {
this.tweetId = tweetId;
this.createTime = createTime;
}

public Integer getTweetId() {
return tweetId;
}

public void setTweetId(Integer tweetId) {
this.tweetId = tweetId;
}

public Long getCreateTime() {
return createTime;
}

public void setCreateTime(Long createTime) {
this.createTime = createTime;
}

@Override
public int compareTo(Tweet o) {
return (int) (this.createTime - o.getCreateTime());
}

@Override
public String toString() {
return "Tweet{" +
"tweetId=" + tweetId +
", createTime=" + createTime +
'}';
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class User {
private Integer userId;

private List<Integer> followerIds;

private List<Integer> followeeIds;

private LinkedList<Tweet> tweets;

public User(Integer userId, List<Integer> followerIds, List<Integer> followeeIds, LinkedList<Tweet> tweets) {
this.userId = userId;
this.followerIds = followerIds;
this.followeeIds = followeeIds;
this.tweets = tweets;
}

public Integer getUserId() {
return userId;
}

public void setUserId(Integer userId) {
this.userId = userId;
}

public List<Integer> getFollowerIds() {
return followerIds;
}

public void setFollowerIds(List<Integer> followerIds) {
this.followerIds = followerIds;
}

public List<Integer> getFolloweeIds() {
return followeeIds;
}

public void setFolloweeIds(List<Integer> followeeIds) {
this.followeeIds = followeeIds;
}

public LinkedList<Tweet> getTweets() {
return tweets;
}

public void setTweets(LinkedList<Tweet> tweets) {
this.tweets = tweets;
}

@Override
public String toString() {
return "User{" +
"userId=" + userId +
", followerIds=" + followerIds +
", followeeIds=" + followeeIds +
", tweets=" + tweets +
'}';
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Twitter {
private Map<Integer, User> users;

public Twitter() {
this.users = new HashMap<>();
}

public void postTweet(int userId, int tweetId) {
Tweet tweet = new Tweet(tweetId, System.nanoTime());
User user = this.users.getOrDefault(userId, createUser(userId));
user.getTweets().addFirst(tweet);
if (user.getTweets().size() > 10) {
user.getTweets().subList(0, 10);
}
this.users.put(userId, user);
}

public List<Integer> getNewsFeed(int userId) {
if (this.users.containsKey(userId)) {
List<Tweet> tweets = new LinkedList<>();
tweets.addAll(this.users.get(userId).getTweets());
this.users.get(userId).getFollowerIds().stream().map(this.users::get).map(User::getTweets).forEach(list -> tweets.addAll(list));
List<Integer> result = tweets.stream().sorted(Comparator.reverseOrder()).distinct().map(Tweet::getTweetId).collect(Collectors.toList());
return result.size() > 10 ? result.subList(0, 10) : result;
}
return new ArrayList<>();
}

public void follow(int followerId, int followeeId) {
User follower = this.users.getOrDefault(followerId, createUser(followerId));
follower.getFollowerIds().add(followeeId);
this.users.put(followerId, follower);
User followee = this.users.getOrDefault(followeeId, createUser(followeeId));
followee.getFolloweeIds().add(followerId);
this.users.put(followeeId, followee);
}

public void unfollow(int followerId, int followeeId) {
this.users.get(followerId).getFollowerIds().remove((Object) followeeId);
this.users.get(followeeId).getFolloweeIds().remove((Object) followerId);
}

private User createUser(Integer userId) {
return new User(userId, new ArrayList<>(), new ArrayList<>(), new LinkedList<>());
}
}