百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

每天一道算法题-实现一个简易版今日头条

toyiye 2024-07-06 00:22 14 浏览 0 评论

题目描述

设计一个简易版今日头条,有以下4个功能:

  1. 发头条,postToutiao(int userId, int toutiaoId)
  2. 关注别人,follow(int followerId, int followeeId)
  3. 取消关注别人,unfollow(int followerId, int followeeId)
  4. 查看10条最近的头条,包括自己发的和我关注的人发的头条,vector<int> getNewsFeed(int userId)

Example

Toutiao toutiao = new Toutiao();
// 用户1发了一条头条,id是5
toutiao.postToutiao(1, 5);
// 查看用户1最近的头条,只有5 -> [5].
toutiao.getNewsFeed(1);
// 用户1关注了用户2
toutiao.follow(1, 2);
// 用户2发了一条头条,id是6.
toutiao.postToutiao(2, 6);
// 查看用户1最近的头条,包括6和5 -> [6, 5].
// 6在5前面,因为6比5发得晚.
twitter.getNewsFeed(1);
// 用户1取消关注用户2.
twitter.unfollow(1, 2);
// 查看用户1最近的头条,只有5 -> [5],
// 因为用户1没有关注用户2.
twitter.getNewsFeed(1);

这道题流程听起来有点复杂,但是没有涉及很难的算法,只要用好几个数据结构,即可达到比较好的算法性能。

设计数据结构

  1. 首先,为了实现头条的排序,需要为头条打上时间戳,因此,存储头条用到pair,即pair<int, int>,第一个int存时间戳,第二个存头条id
  2. 然后,要建一张表,记录每个用户发的头条,为了快速索引到用户,则用到hash map,用户id作为key,头条作为value,即unordered_map<int, vector<pair<int, int>>>
  3. 另一张表,记录每个用户关注的人,由于关注的人不能重复,所以还要用到集合unordered_set,即unordered_map<int, unordered_set<int>> follower_map
  4. 查看最近10条头条时,为了方便排序,用一下优先级队列priority_queue

C++代码

有了上面的数据结构,就可以开始写代码了。

首先,定义一个类,把成员变量和接口封装起来,在构造函数中进行简单的初始化:

发头条,很简单,构造一个pair,然后塞进feed_map里即可,新发的头条要放在最前面,这里用到的cur_feed_id就是之前提到的时间戳,每增加一条,则加1,用于头条的排序

关注,很简单,把要关注的人的id塞进map里即可,但是这里有一个case----关注自己,是不允许滴。。。

取消关注,简单,把id从map中擦掉即可。

查看最近10条头条,相对复杂了,我们先看下这里面用到的优先级队列的定义,定义一个cmp结构体,实现优先级队列中pair的排序,新的在队尾,旧的在队首:

下面是函数的实现,定义一个优先级队列用于存放结果,首先遍历自己发的头条,往优先级队列里面塞,新发的头条会自己跑到队尾,如果队列长度不到10,就直接塞,如果超过了,塞完后,要把队首的(最旧的)pop出去。

由于发头条时,已经将头条排好序了,所以遍历时,一旦遇到比队首还旧的,即可停止遍历。

遍历关注的人发的头条,与遍历自己发的头条,流程一样。

最后将priority_queue里面的头条放到vector中,前后顺序翻转一下,即可返回。

复杂度

发头条、关注和取关 的时间复杂度都是O(1),查看最近头条的时间复杂度是O(N),N为自己+关注的人发的所有的头条数。

参考资料:

Leetcode 第355题, https://leetcode.com/problems/design-twitter/

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码