Skip to content

Commit f741fab

Browse files
committed
二刷355
1 parent 1bde2c9 commit f741fab

File tree

3 files changed

+106
-11
lines changed

3 files changed

+106
-11
lines changed

docs/0355-design-twitter.adoc

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
[#0355-design-twitter]
22
= 355. 设计推特
33

4-
https://leetcode.cn/problems/design-twitter/[LeetCode - 355. 设计推特 ^]
4+
https://leetcode.cn/problems/design-twitter/[LeetCode - 355. 设计推特^]
55

66
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近 `10` 条推文。
77

88
实现 `Twitter` 类:
99

1010
* `Twitter()` 初始化简易版推特对象
1111
* `void postTweet(int userId, int tweetId)` 根据给定的 `tweetId``userId` 创建一条新推文。每次调用此函数都会使用一个不同的 `tweetId`
12-
* `List<Integer> getNewsFeed(int userId)` 检索当前用户新闻推送中最近 `10` 条推文的 ID。新闻推送中的每一项都必须是由用户关注的人或者是用户自己发布的推文。推文必须
13-
*按照时间顺序由最近到最远排序*
12+
* `List<Integer> getNewsFeed(int userId)` 检索当前用户新闻推送中最近 `10` 条推文的 ID。新闻推送中的每一项都必须是由用户关注的人或者是用户自己发布的推文。推文必须 *按照时间顺序由最近到最远排序*
1413
* `void follow(int followerId, int followeeId)` ID 为 `followerId` 的用户开始关注 ID 为 `followeeId` 的用户。
1514
* `void unfollow(int followerId, int followeeId)` ID 为 `followerId` 的用户不再关注 ID 为 `followeeId` 的用户。
1615
@@ -64,14 +63,14 @@ include::{sourcedir}/_0355_DesignTwitter.java[tag=answer]
6463
----
6564
--
6665
67-
// 二刷::
68-
// +
69-
// --
70-
// [{java_src_attr}]
71-
// ----
72-
// include::{sourcedir}/_0355_DesignTwitter_2.java[tag=answer]
73-
// ----
74-
// --
66+
二刷::
67+
+
68+
--
69+
[{java_src_attr}]
70+
----
71+
include::{sourcedir}/_0355_DesignTwitter_2.java[tag=answer]
72+
----
73+
--
7574
====
7675

7776

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,6 +1544,11 @@ endif::[]
15441544
|{doc_base_url}/0480-sliding-window-median.adoc[题解]
15451545
|⭕️ 滑动窗口+双堆。单纯利用双堆,只能通过 43 / 44 个测试用例。延迟删除的实现有些复杂,还要再研究一下。
15461546

1547+
|{counter:codes2503}
1548+
|{leetcode_base_url}/design-twitter/[355. 设计推特^]
1549+
|{doc_base_url}/0355-design-twitter.adoc[题解]
1550+
|✅ 多路归并的解法。
1551+
15471552
|===
15481553

15491554
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.*;
4+
5+
public class _0355_DesignTwitter_2 {
6+
// tag::answer[]
7+
8+
/**
9+
* @author D瓜哥 · https://www.diguage.com
10+
* @since 2025-09-16 21:05:24
11+
*/
12+
static class Twitter {
13+
14+
private Map<Integer, Set<Integer>> follower;
15+
private Map<Integer, Tweet> tweets;
16+
17+
private int timestamp;
18+
19+
20+
public Twitter() {
21+
follower = new HashMap<>();
22+
tweets = new HashMap<>();
23+
timestamp = 0;
24+
}
25+
26+
public void postTweet(int userId, int tweetId) {
27+
timestamp++;
28+
Tweet tweet = new Tweet(tweetId, timestamp);
29+
tweet.next = tweets.get(userId);
30+
tweets.put(userId, tweet);
31+
}
32+
33+
public List<Integer> getNewsFeed(int userId) {
34+
PriorityQueue<Tweet> queue = new PriorityQueue<>((a, b) ->
35+
Integer.compare(b.timestamp, a.timestamp));
36+
if (tweets.containsKey(userId)) {
37+
queue.offer(tweets.get(userId));
38+
}
39+
Set<Integer> followers = follower.getOrDefault(userId, new HashSet<>());
40+
for (Integer uid : followers) {
41+
if (tweets.containsKey(uid)) {
42+
queue.offer(tweets.get(uid));
43+
}
44+
}
45+
List<Integer> result = new ArrayList<>();
46+
while (!queue.isEmpty() && result.size() < 10) {
47+
Tweet ts = queue.poll();
48+
result.add(ts.tweetId);
49+
if (ts.next != null) {
50+
queue.offer(ts.next);
51+
}
52+
}
53+
return result;
54+
}
55+
56+
public void follow(int followerId, int followeeId) {
57+
if (followeeId == followerId) {
58+
return;
59+
}
60+
follower.computeIfAbsent(followerId, k -> new HashSet<>()).add(followeeId);
61+
}
62+
63+
public void unfollow(int followerId, int followeeId) {
64+
if (followeeId == followerId) {
65+
return;
66+
}
67+
follower.computeIfAbsent(followerId, k -> new HashSet<>()).remove(followeeId);
68+
}
69+
70+
private static class Tweet {
71+
int tweetId;
72+
int timestamp;
73+
Tweet next;
74+
75+
public Tweet(int tweetId,int timestamp) {
76+
this.tweetId = tweetId;
77+
this.timestamp = timestamp;
78+
}
79+
}
80+
}
81+
// end::answer[]
82+
83+
public static void main(String[] args) {
84+
Twitter twitter = new Twitter();
85+
twitter.postTweet(1, 4);
86+
twitter.postTweet(2, 5);
87+
twitter.unfollow(1, 2);
88+
twitter.follow(1, 2);
89+
twitter.getNewsFeed(1);
90+
}
91+
}

0 commit comments

Comments
 (0)