您的位置:首页 > 其它

Mini Twitter

2016-07-07 02:59 134 查看
Implement a simple twitter. Support the following method:
postTweet(user_id, tweet_text)
. Post a tweet.
getTimeline(user_id)
. Get the given user's most recently 10 tweets posted by himself, order by timestamp from most recent to least recent.
getNewsFeed(user_id)
. Get the given user's most recently 10 tweets in his news feed (posted by his friends and himself). Order by timestamp from most recent to least recent.
follow(from_user_id, to_user_id)
. from_user_id followed to_user_id.
unfollow(from_user_id, to_user_id)
. from_user_id unfollowed to to_user_id.
Example:
postTweet(1, "LintCode is Good!!!")
>> 1
getNewsFeed(1)
>> [1]
getTimeline(1)
>> [1]
follow(2, 1)
getNewsFeed(2)
>> [1]
unfollow(2, 1)
getNewsFeed(2)
>> []
[/code]
/**
* 本代码由九章算法编辑提供。没有版权欢迎转发。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,九章强化班,Java入门与基础算法班,
* - 更多详情请见官方网站:http://www.jiuzhang.com/
*/

/**
* 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 {
class Node {
public int order;
public Tweet tweet;
public Node(int o, Tweet t) {
this.order = o;
this.tweet = t;
}
}

class SortByOrder implements Comparator {
public int compare(Object obj1,Object obj2) {
Node node1 = (Node) obj1;
Node node2 = (Node) obj2;
if (node1.order < node2.order)
return 1;
else
return -1;
}
}

private Map<Integer, Set<Integer>> friends;
private Map<Integer, List<Node>> users_tweets;
private int order;

public List<Node> getLastTen(List<Node> tmp) {
int last = 10;
if (tmp.size() < 10)
last = tmp.size();
return tmp.subList(tmp.size() - last, tmp.size());
}

public List<Node> getFirstTen(List<Node> tmp) {
int last = 10;
if (tmp.size() < 10)
last = tmp.size();
return tmp.subList(0, last);
}

public MiniTwitter() {
// initialize your data structure here.
this.friends = new HashMap<Integer, Set<Integer>>();
this.users_tweets = new HashMap<Integer, List<Node>>();
this.order = 0;
}

// @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 tweet = Tweet.create(user_id, tweet_text);
if (!users_tweets.containsKey(user_id))
users_tweets.put(user_id, new ArrayList<Node>());
order += 1;
users_tweets.get(user_id).add(new Node(order, tweet));
return tweet;
}

// @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<Node> tmp = new ArrayList<Node>();
if (users_tweets.containsKey(user_id))
tmp.addAll(getLastTen(users_tweets.get(user_id)));

if (friends.containsKey(user_id)) {
for (Integer user : friends.get(user_id)) {
if (users_tweets.containsKey(user))
tmp.addAll(getLastTen(users_tweets.get(user)));
}
}

Collections.sort(tmp, new SortByOrder());
List<Tweet> rt = new ArrayList<Tweet>();
tmp = getFirstTen(tmp);
for (Node node : tmp) {
rt.add(node.tweet);
}
return rt;
}

// @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<Node> tmp = new ArrayList<Node>();
if (users_tweets.containsKey(user_id))
tmp.addAll(getLastTen(users_tweets.get(user_id)));

Collections.sort(tmp, new SortByOrder());
List<Tweet> rt = new ArrayList<Tweet>();
tmp = getFirstTen(tmp);
for (Node node : tmp)
rt.add(node.tweet);
return rt;
}

// @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 (!friends.containsKey(from_user_id))
friends.put(from_user_id, new HashSet<Integer>());

friends.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 (friends.containsKey(from_user_id))
friends.get(from_user_id).remove(to_user_id);
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: