描述:
实现一个迷你的推特,支持下列几种方法
1.postTweet(user_id, tweet_text).
发布一条推特.
2.getTimeline(user_id).
获得给定用户最新发布的十条推特,按照发布时间从最近的到之前排序
3.getNewsFeed(user_id).
获得给定用户的朋友或者他自己发布的最新十条推特,从发布时间最近到之前排序
4.follow(from_user_id, to_user_id).
from_user_id 关注 to_user_id.
5.unfollow(from_user_id, to_user_id).
from_user_id 取消关注 to_user_id.
样例:
postTweet(1, "LintCode is Good!!!")
>> 1
getNewsFeed(1)
>> [1]
getTimeline(1)
>> [1]
follow(2, 1)
getNewsFeed(2)
>> [1]
unfollow(2, 1)
getNewsFeed(2)
>> []
思路:
创建全局的状态列表list和用户hashmap,所有的用户状态都存储在list中tweet包含user_id,在进行操作之前要记得判空
/**
* Definition of Tweet:
* public class Tweet {
* public int id;
* public int user_id;
* public String text;
* public static Tweet create(int user_id, String tweet_text) {
* // This will create a new tweet object,
* // and auto fill id
* }
* }
*/
public class MiniTwitter {
ArrayList<Tweet> TweetList = new ArrayList<Tweet>();
HashMap<Integer , HashSet<Integer>> Follows = new HashMap<Integer , HashSet<Integer>>();
public MiniTwitter() {
// initialize your data structure here.
}
// @param user_id an integer
// @param tweet a string
// return a tweet
public Tweet postTweet(int user_id, String tweet_text) {
// Write your code here
Tweet state = Tweet.create(user_id , tweet_text);
TweetList.add(state);
return state;
}
// @param user_id an integer
// return a list of 10 new feeds recently
// and sort by timeline
public List<Tweet> getNewsFeed(int user_id) {
// Write your code here
List<Tweet> result = new ArrayList<Tweet>();
int count = 0;
HashSet<Integer> temp = Follows.get(user_id);
for(int i = TweetList.size() - 1;i>=0;i--){
if(TweetList.get(i).user_id == user_id ){
result.add(TweetList.get(i));
count++;
}
if(temp != null && temp.contains(TweetList.get(i).user_id)){
result.add(TweetList.get(i));
count++;
}
if(count >= 10){
break;
}
}
return result;
}
// @param user_id an integer
// return a list of 10 new posts recently
// and sort by timeline
public List<Tweet> getTimeline(int user_id) {
// Write your code here
List<Tweet> result = new ArrayList<Tweet>();
int count = 0;
for(int i = TweetList.size() - 1;i>=0;i--){
if(TweetList.get(i).user_id == user_id){
result.add(TweetList.get(i));
count++;
}
if(count >= 10){
break;
}
}
return result;
}
// @param from_user_id an integer
// @param to_user_id an integer
// from user_id follows to_user_id
public void follow(int from_user_id, int to_user_id) {
// Write your code here
if(Follows.get(from_user_id) == null){
Follows.put(from_user_id , new HashSet<Integer>() );
}
if(!Follows.get(from_user_id).contains(to_user_id)){
Follows.get(from_user_id).add(to_user_id);
}
}
// @param from_user_id an integer
// @param to_user_id an integer
// from user_id unfollows to_user_id
public void unfollow(int from_user_id, int to_user_id) {
// Write your code here
if(Follows.get(from_user_id) == null){
Follows.put(from_user_id , new HashSet<Integer>() );
}
if(Follows.get(from_user_id).contains(to_user_id)){
Follows.get(from_user_id).remove(to_user_id);
}
}
}