【程序设计】设计推特

题目:355. 设计推特 - 力扣(LeetCode)

题目描述:

题目所描述的场景在许多app中都可以见到。以微博为例,当我新关注一个博主后,刷新一下我的页面,博主所发的推文就会出现在我的主页,同时会与出现在主页的其它推文按时间排好序。

核心且最难实现的功能是getNewsFeed,返回的结果是按时间排好序的,同时用户的关注是动态变化的。

问题分析:

        (1)既然要求时间有序,那我们把用户各自的推文存储在链表中,链表中的节点存储推文的id和时间戳time,整个链表根据时间戳time进行排序。

        (2)当调用getNewsFeed获取推文时,我们就可以先去获取用户关注的所有人,再把这些人的推文链表的头结点加入优先级队列中进行排序,最后返回包含十条推文id的列表即可。

组件设计:

        Twitter类有两个重要元素参与用户以及推文,所以User类与Tewwt类以静态内部类的形式存在于Twitter类中。除此之外,每个Twitter有一个时间戳timestamp,用于作为排序依据。

        (1)Tweet类:每个Tweet对象有一个tweetId和一个发布时间time,除此之外,由于tweet类还会作为节点存储到链表中,所以要有一个next指针指向下一个推文。

        

        (2)User类:每个用户需要有一个userId、关注列表、历史推文列表等三个成员变量。用户无法重复关注,所以关注列表可以用Hash Set来实现,去重的同时保证快速查找;历史推文列表则可以直接用链表来实现(链表头部是最近发布的推文,越往后,发布时间越早)。同时,发文、关注、取关等方法都是用户User的行为,根据面向对象设计原则,User类中应该还要实现post、follow、unfollow这几个方法。

        (3)Twitter类的大体实现(不包含getNewsFeed)

        (5)getNewsFeed实现:首先判断用户是否在map中存在,不存在则直接返回一个空列表,随后获取用户的关注列表,将关注列表中每个用户tweet列表的头节点加入优先级队列,优先级队列会自动按照排序规则进行排序,最后返回包含10条推文id的列表即可。

        在队列poll出某个关注用户最近的tweet时,要判断它有没有指向的下一条推文。若有,则要将其下一条推文加入到优先级队列中进行排序,避免错过某些最近发布的推文。

补充说明:

        getNewsFeed的实现用到了PriorityQueue优先级队列,它能自动地帮我们将加入到队列中的Tweet按照发布时间time进行排序,保证每一次poll出的Tweet都是最近的(timestamp最大)。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值