解答
package leetcode.editor.cn;
import java.util.*;
//leetcode submit region begin(Prohibit modification and deletion)
class Twitter {
private Map<Integer, List<Integer>> userTweets;
private Map<Integer, Set<Integer>> userFollowers;
private Map<Integer, Integer> tweetTimeline;
private int counter;
public Twitter() {
userTweets = new HashMap<>();
userFollowers = new HashMap<>();
tweetTimeline = new HashMap<>();
counter = 0;
}
public void postTweet(int userId, int tweetId) {
List<Integer> tweets = null;
if (userTweets.containsKey(userId)) {
tweets = userTweets.get(userId);
} else {
tweets = new ArrayList<Integer>();
userTweets.put(userId, tweets);
}
tweets.add(tweetId);
tweetTimeline.put(tweetId, ++counter);
}
public List<Integer> getNewsFeed(int userId) {
LinkedList<Integer> tweets = new LinkedList<>();
List<Integer> ownTweets = userTweets.getOrDefault(userId, Collections.emptyList());
tweets.addAll(ownTweets);
for (Integer followeeId : userFollowers.getOrDefault(userId, Collections.emptySet())) {
List<Integer> followeeTweets = userTweets.getOrDefault(followeeId, Collections.emptyList());
tweets.addAll(followeeTweets);
}
Collections.sort(tweets, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return tweetTimeline.getOrDefault(o2, 0) - tweetTimeline.getOrDefault(o1, 0);
}
});
if (tweets.size() > 10) {
return tweets.subList(0, 10);
}
return tweets;
}
public void follow(int followerId, int followeeId) {
if (followerId == followeeId) {
return;
}
Set<Integer> followeeIds = null;
if (userFollowers.containsKey(followerId)) {
followeeIds = userFollowers.get(followerId);
} else {
followeeIds = new HashSet<Integer>();
userFollowers.put(followerId, followeeIds);
}
followeeIds.add(followeeId);
}
public void unfollow(int followerId, int followeeId) {
if (!userFollowers.containsKey(followerId)) {
return;
}
Set<Integer> followeeIds = userFollowers.get(followerId);
followeeIds.remove(Integer.valueOf(followeeId));
}
}
/**
* Your Twitter object will be instantiated and called as such:
* Twitter obj = new Twitter();
* obj.postTweet(userId,tweetId);
* List<Integer> param_2 = obj.getNewsFeed(userId);
* obj.follow(followerId,followeeId);
* obj.unfollow(followerId,followeeId);
*/
//leetcode submit region end(Prohibit modification and deletion)
测试用例
package leetcode.editor.cn;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
public class TwitterTest {
private Twitter t = null;
@Before
public void setup() {
t = new Twitter();
}
@Test
public void test1() {
List<Integer> tweets = null;
t.postTweet(1, 5);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 5);
t.follow(1, 2);
t.postTweet(2, 6);
tweets = t.getNewsFeed(2);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 6);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 2);
Assert.assertTrue(tweets.get(0) == 6);
Assert.assertTrue(tweets.get(1) == 5);
t.unfollow(1, 2);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 5);
}
@Test
public void test2() {
List<Integer> tweets = null;
t.postTweet(1, 5);
t.postTweet(1, 3);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 2);
Assert.assertTrue(tweets.get(0) == 3);
Assert.assertTrue(tweets.get(1) == 5);
}
@Test
public void test3() {
List<Integer> tweets = null;
t.postTweet(1, 4);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 4);
t.postTweet(2, 5);
tweets = t.getNewsFeed(2);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 5);
t.unfollow(1, 2);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 4);
}
@Test
public void test4() {
List<Integer> tweets = null;
t.postTweet(2, 5);
tweets = t.getNewsFeed(2);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 5);
t.follow(1, 2);
t.follow(1, 2);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 1);
Assert.assertTrue(tweets.get(0) == 5);
}
@Test
public void test5() {
List<Integer> tweets = null;
t.postTweet(1, 5);
t.postTweet(1, 3);
t.postTweet(1, 101);
t.postTweet(1, 13);
t.postTweet(1, 10);
t.postTweet(1, 2);
t.postTweet(1, 94);
t.postTweet(1, 505);
t.postTweet(1, 333);
t.postTweet(1, 22);
t.postTweet(1, 11);
tweets = t.getNewsFeed(1);
Assert.assertTrue(tweets.size() == 10);
int[] values = new int[]{
11, 22, 333, 505, 94, 2, 10, 13, 101, 3
};
for (int i = 0; i < values.length; ++i) {
Assert.assertTrue(values[i] == tweets.get(i));
}
}
}