355. 设计推特

该博客介绍了如何设计一个Twitter类,包括发布推文、获取新闻推送、关注与取消关注等功能。核心数据结构包括用于存储推文记录的Map和保存关注关系的Map。推文按发布时间排序,新闻推送显示用户及其关注者发布的最新10条推文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* 355. 设计推特
*/
class Twitter {
    /**
    * 保存twitter记录
    */
    private Map<Integer, List<TweetRecord>> tweetMap;
    /**
    * 保存关注关系
    */
    private Map<Integer, Set<Integer>> followMap;
    
    private Long rTime = 0L;
    /** Initialize your data structure here. */
    public Twitter() {
        tweetMap = new HashMap();
        followMap = new HashMap();
    }
    
    /** Compose a new tweet. */
    public void postTweet(int userId, int tweetId) {
        List<TweetRecord> tweetList = tweetMap.get(userId);
        if(tweetList == null){
            tweetList = new ArrayList();
            tweetList.add(new TweetRecord(tweetId, rTime++));
            tweetMap.put(userId, tweetList);
        }else{
            tweetList.add(new TweetRecord(tweetId, rTime++));
        }
    }
    
    /** Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. */
    public List<Integer> getNewsFeed(int userId) {
        List<Integer> result = new ArrayList();
        List<TweetRecord> tmpList = new ArrayList();
        if(tweetMap.get(userId) != null){
            tmpList.addAll(tweetMap.get(userId));
        }
        Set<Integer> followIds = followMap.get(userId);
        if(followIds != null) {
        	for(Integer followId: followIds){
                if(followId == userId){
                    continue;
                }
                List<TweetRecord> tweetList = tweetMap.get(followId);
                if(tweetList != null){
                    tmpList.addAll(tweetList);
                }
            }
        }
        Collections.sort(tmpList, new Comparator<TweetRecord>(){
            public int compare(TweetRecord o1, TweetRecord o2){
                return o2.getPubTime().compareTo(o1.getPubTime());
            }
        });
        int count = 0;
        for(TweetRecord tr: tmpList){
            if(count == 10){
                break;
            }
            result.add(tr.getTweetId());
            count++;
        }
        return result;
    }
    
    /** Follower follows a followee. If the operation is invalid, it should be a no-op. */
    public void follow(int followerId, int followeeId) {
        Set<Integer> followList = followMap.get(followerId);
        if(followList == null){
            followList = new HashSet();
            followList.add(followeeId);
            followMap.put(followerId, followList);
        }else{
            followList.add(followeeId);
        }
    }
    
    /** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
    public void unfollow(int followerId, int followeeId) {
        Set<Integer> followList = followMap.get(followerId);
        if(followList == null){
            return;
        }
        boolean flag = followList.contains(followeeId);
        if(flag){
            followList.remove(followeeId);
        }
    }

    class TweetRecord{
        private Integer tweetId;
        private Long pubTime;

        TweetRecord(Integer id, long time){
            tweetId = id;
            pubTime = time;
        }

        public Long getPubTime(){
            return pubTime;
        }
        public Integer getTweetId(){
            return tweetId;
        }
    }
}

/**
 * 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);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值