leetcode — JavaScript专题(三):完全相等的 JSON 字符串、复合函数、 分组、柯里化、将对象转换为 JSON 字符串
专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷
2628. 完全相等的 JSON 字符串
题面
给定两个对象 o1 和 o2 ,请你检查它们是否 完全相等 。
对于两个 完全相等 的对象,它们必须包含相同的键,并且相关的值也必须 完全相等 。如果两个对象通过了 === 相等性检查,它们也被认为是 完全相等 的。
你可以假设这两个对象都是 JSON.parse 的输出。换句话说,它们是有效的 JSON 。
请你在不使用 lodash 的 _.isEqual() 函数的前提下解决这个问题。
知识点:
深比较、递归、Json、JS 数据类型
思路
深度比较两个对象,我们比较两个传入的数值,分以下这些情况:
- 如果类型不相等,我们直接判定其不相等
- 如果类型相等,如果不是 object ,我们直接比较他们的值
- 如果是 object,如果是 null 两者都是 null 则相同,否则不同
- 如果是 object 并且都是数组,我们先比较数组的长度,如果相同,我们依次递归比较数组的每一个元素
- 如果是 object 并且是对象,我们先比较每个键值是不是一样,如果键值都相同我们再递归比较每个键值对应的数据是不是相同
代码
var areDeeplyEqual = function (o1, o2) {if (o1 === null && o2 === null) {return true;}if (typeof o1 != typeof o2) return false;if (typeof o1 !== 'object') {return o1 === o2;} else {if (o1 instanceof Array !== o2 instanceof Array) return falseif (o1 instanceof Array) {if (o1.length !== o2.length) return falsefor (let i = 0; i < o1.length; i++) {if (!areDeeplyEqual(o1[i], o2[i])) {return false;}}} else {let k1 = Object.keys(o1).sort();let k2 = Object.keys(o2).sort();if (k1.join(",") !== k2.join(",")) return false; for (const key in o1) {if (!areDeeplyEqual(o1[key], o2[key])) {return false}}}}return true
};
2629. 复合函数
题面
请你编写一个函数,它接收一个函数数组 [f1, f2, f3,…], fn] ,并返回一个新的函数 fn ,它是函数数组的 复合函数 。
[f(x), g(x), h(x)] 的 复合函数 为 fn(x) = f(g(h(x))) 。
一个空函数列表的 复合函数 是 恒等函数 f(x) = x 。
你可以假设数组中的每个函数接受一个整型参数作为输入,并返回一个整型作为输出。
知识点:
数组
思路
获取操作函数的数组,从最内层的操作函数(数组最后一位)依次执行这些操作函数即可
代码
var compose = function (functions) {return function (x) {for (var i = functions.length - 1; i >= 0 ; i--) {x = functions[i](x);}return x;}
};
/*** const fn = compose([x => x + 1, x => 2 * x])* fn(4) // 9*/
2631. 分组
题面
请你编写一段可应用于所有数组的代码,使任何数组调用 array. groupBy(fn) 方法时,它返回对该数组 分组后 的结果。
数组 分组 是一个对象,其中的每个键都是 fn(arr[i]) 的输出的一个数组,该数组中含有原数组中具有该键的所有项。
提供的回调函数 fn 将接受数组中的项并返回一个字符串类型的键。
每个值列表的顺序应该与元素在数组中出现的顺序相同。任何顺序的键都是可以接受的。
请在不使用 lodash 的 _.groupBy 函数的前提下解决这个问题。
知识点:
groupBy 、哈希表
思路
初始化一个对象摸你哈希表,用数组作为 value。
对于每个值,我们使用 fn 操作之后,判定哈希表中有没有对应的键值,如果有,把当前数组插入哈希表的这一键值的数组中,如果没有,创建这个键值,在插入即可
代码
Array.prototype.groupBy = function (fn) {let obj = {};for (var i = 0; i < this.length; i++) {let k = fn(this[i]).toString();if(obj[k] == null){obj[k] = [];}obj[k].push(this[i]);}return obj;
};/*** [1,2,3].groupBy(String) // {"1":[1],"2":[2],"3":[3]}*/
2632. 柯里化
题面
请你编写一个函数,它接收一个其他的函数,并返回该函数的 柯里化 后的形式。
柯里化 函数的定义是接受与原函数相同数量或更少数量的参数,并返回另一个 柯里化 后的函数或与原函数相同的值。
实际上,当你调用原函数,如 sum(1,2,3) 时,它将调用 柯里化 函数的某个形式,如 csum(1)(2)(3), csum(1)(2,3), csum(1,2)(3),或 csum(1,2,3) 。所有调用 柯里化 函数的方法都应该返回与原始函数相同的值。
知识点:
柯里化
思路
通用模板,先在我们的函数中初始化一个数组,用来保存所有的参数。
我们可以通过函数的 length 属性可以获取他传入的参数总数,柯里化之后也能获取他总共的参数,不论他调用几次。
之后我们通过 arguments 获得每次接收一次调用的参数,把它放在我们的数组中,通过数组的长度和我们的总共参数的数量比较,如果还没调用完毕,我们返回我们的柯里化函数继续接收参数,如果调用完毕,我们将我们的参数列表传入给出的需要柯里化的计算函数返回结果即可。
代码
var curry = function(fn) {let argv = [];return function curried() {for(let a of arguments){argv.push(a);}if(argv.length == fn.length){return fn(...argv);}else{return curried;}};
};/*** function sum(a, b) { return a + b; }* const csum = curry(sum);* csum(1)(2) // 3*/
2633. 将对象转换为 JSON 字符串
题面
现给定一个对象,返回该对象的有效 JSON 字符串。你可以假设这个对象只包括字符串、整数、数组、对象、布尔值和 null。返回的字符串不能包含额外的空格。键的返回顺序应该与 Object.keys() 的顺序相同。
请你在不使用内置方法 JSON.stringify 的前提下解决这个问题。
知识点:
递归、Json、JS 数据类型
思路
根据我们传入的对象来判断进行操作:
- 如果是传入一个 string,我们直接加上引号返回 json 字符串即可
- 如果传入 null ,我们返回字符串的 null
- 如果传入一个数组
- 我们先构造我们的数组开始符号
[
之后依次遍历数组的每一个元素,递归调用我们的函数,之后判断要不要添加我们的分隔符,
, 遍历结束,我们加上数组的结束符号]
- 如果是对象,我们和数组的操作大同小异,依次遍历每个键值,需要把键值和结果数据都构造出来,用
:
分割,其他操作一致 - 如果不是数组、对象和字符串,我们直接把它转为字符串即可类型即可
- 递归整个对象,拼接字符串返回即可
代码
var jsonStringify = function (object) {let type = typeof object;if (type == "string") {return `"${object}"`;} else if (type == 'object') {if (object == null) {return "null";} else if (object instanceof Array) {let re = "[";for (var i = 0; i < object.length; i++) {if (i != 0) {re += ",";}re += jsonStringify(object[i])}return re + "]";} else {let re = "{";let keys = Object.keys(object);for (var i = 0; i < keys.length; i++) {if (i != 0) {re += ",";}re += `"${keys[i]}":${jsonStringify(object[keys[i]])}`;}re += "}";return re;}} else {return "" + object;}
};
相关文章:
leetcode — JavaScript专题(三):完全相等的 JSON 字符串、复合函数、 分组、柯里化、将对象转换为 JSON 字符串
专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷 2628. 完全相等的 JSON 字符串 题面 给定两个对象 o1 和 o2 ,请你检查它们是否 完全相等 。 对于两个 完全相等 的对象,它们必须包含相…...
OGNL 的表达式
目录 概念 基本原理 基本语法 1、访问Root区域对象基本语法 2、访问Context区域对象基本语法 符号含义 概念 Object-Graph Navigation Language 对象-图形导航语言, 主要用于访问对象的数据和方法。 基本原理 主要由3部分构成:1.OGNL引擎 …...
JAVA面试中遇到的那些坑,80%的人都种过招
面试,是很多学完Java开发的人不得不面对的问题。小编经常听到学员抱怨,明明觉得自己学的不错,为什么到了面试的时候就凉凉了?为什么有的面试官会一直问业务层面的问题,让人措手不及? 其实,我们在学习Java知识的同时…...
【测试开发】单元测试、基准测试和性能分析(以 Go testing 为例)
一、为什么需要测试🤔️ 你写不出 bug-free 的代码。你认为自己写出了 bug-free 的代码,但它在你意想不到的地方出错了。你觉得自己写出了永不出错的代码,但它的性能十分糟糕。 二、在开发过程中做好测试(理想情况下)…...
linux中一条命令查询当前端口的进程,然后拿到进程pid,作为另一条杀死进程的参数
1. 可以使用lsof命令来查询端口对应的进程,然后使用awk命令提取PID,最后将其作为另一条命令的参数。 例如,如果要查询端口为8080的进程: lsof -i :8080 | awk NR2{print $2}其中,-i选项指定查询网络连接,…...
程序员找工作难吗?我用亲身经历来告诉大家
我看到很多同学说今年的程序员找工作难。我的心里也有一定预期,但直到我出来之后才真正地感受到这股寒冬有多么凛冽。 一个外包公司有四五个招聘人员,然后外包公司有十来个,一个公司的岗位会分发给这些各个不同的外包公司。所以你看到我沟通…...
【Web服务】HTTP和DNS重要知识
304状态码 HTTP状态码中的304状态码表示"未修改",通常在客户端发起了一个带有If-Modified-Since头部的GET请求时会得到这个响应。服务器通过比较If-Modified-Since头部指定的时间戳和资源的最后修改时间来判断资源是否被修改过,如果没有修改则…...
【C++】-关于类和对象的默认成员函数(中)-拷贝构造函数和赋值运算符重载函数
💖作者:小树苗渴望变成参天大树 ❤️🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点…...
c++11上篇
c11 1.C11简介2.列表初始化2.1 {}初始化2.2 std::initializer_list 3.变量类型推导3.1 auto3.2 decltype3.3 nullptr 4.范围for循环5.final与override6.智能指针7.新增加容器---静态数组array、forward_list以及unordered系列8.默认成员函数控制9.右值引…...
异构无线传感器网络路由算法研究(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 无线传感器网络(Wireless Sensor Networks, WSN)是一种新型的融合传感器、计算机、通信等多学科的信息获取和处理技术的网络,…...
MySQL数据库——MySQL TRUNCATE:清空表记录
MySQL 提供了 DELETE 和 TRUNCATE 关键字来删除表中的数据。下面主要讲解一下 TRUNCATE 关键字的使用。 TRUNCATE 关键字用于完全清空一个表。其语法格式如下: TRUNCATE [TABLE] 表名 其中,TABLE 关键字可省略。 例 1 新建表 tb_student_course&…...
财报解读:连续三年逆势增长的背后,欧派家居到底靠的是什么?
能在过去3年逆势增长的家居企业并不多,而欧派家居就是其中一个。4月25日,欧派家居发布2022年年度报告。据年报数据显示,2022年,欧派家居共实现营业收入224.80亿元,净利润约26.88亿元。 从2020年到2022年,欧…...
希望计算机专业同学都知道这些宝藏博主
湖科大教书匠——计算机网络 “宝藏老师”、“干货满满”、“羡慕湖科大”…这些都是网友对这门网课的评价,可见网课质量之高! 湖南科技大学《计算机网络》微课堂是该校高军老师精心制作的视频课程,用简单的语言描述复杂的问题,…...
1694_week1_MIT使用Python编程学习手记1
全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下,这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准,很可能会有大量的疏漏。再此,我只想把自己学习时候的一…...
第二十一章 光源
光源是每个场景必不可少的部分,光源除了能够照亮场景之外,还可以产生阴影效果。 Unity中分为四种光源类型: 1. 方向光:Directional Light 用于模拟太阳光,方向光任何地方都能照射到。 2. 点光源:Point L…...
CVPR 2023 超分辨率(super-resolution)方向上接收论文总结
目录 CVPR 2023图像超分任意尺度超分盲超分 视频超分特殊场景 总结参考资料 CVPR 2023 官网链接:https://cvpr2023.thecvf.com/ 会议时间:2023年6月18日-6月22日,加拿大温哥华 CVPR 2023统计数据: 提交:9155篇论文接…...
Python 基于 Django 的学生成绩管理系统,可视化界面(附源码,教程)
1简介 对于学生成绩管理系统,充分运用现代化的信息技术手段,对于学生成绩信息管理发展的趋势就是信息化,信息化时代下的信息管理,需要深化信息管理体制与手段的改革,充分运用信息化手段来全方位的进行学生成绩管理系统…...
第二弹进阶吴恩达 ChatGPT Prompt 技巧
第一弹笔记在这里: 总结吴恩达 ChatGPT Prompt 免费课程 今天分享第二弹,进阶篇。 第一点,任务序列化。 通常看完一篇长文,脑子里往往充满无数疑问。急切想知道所有答案,必须列一个问题清单。对话式问法,对…...
约瑟夫环问题
约瑟夫问题 题目描述 n n n 个人围成一圈,从第一个人开始报数,数到 m m m 的人出列,再由下一个人重新从 1 1 1 开始报数,数到 m m m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。…...
JavaScript中的异步编程
当我们在编写JavaScript代码时,经常会遇到需要执行长时间运行的任务的情况,例如从服务器获取数据或进行复杂的计算。在这些情况下,我们不希望阻塞用户界面,因为这会使网站看起来卡顿,甚至无响应。为了避免这种情况&…...
奥斯汀独家对话|从机构的「拉扯」中成长的美国加密监管
前言 4月25日,在美国得克萨斯州的首府奥斯汀,这座充满活力和创造力的城市,欧科云链研究院与来自哥伦比亚商学院的Austin Campbell教授就美国加密监管以及其相关话题进行了一次深入探讨。双方讨论了美国整体的监管问题、监管逻辑、最新的稳…...
PostgreSQL16中pg_dump的LZ4和ZSTD压缩
PostgreSQL16中pg_dump的LZ4和ZSTD压缩 pg_dump压缩lz4和zstd LZ4和ZSTD压缩算法合入了PG16。LZ4补丁的作者是Georgios Kokolatos。由Tomas Vondra提交。由Michael Paquier、Rachel Heaton、Justin Pryzby、Shi Yu 和 Tomas Vondra 审阅。提交消息是: Expand pg_dum…...
网络安全基础入门学习路线
在大多数的思维里总觉得学习网络安全得先收集资料、学习编程、学习计算机基础,这样不是不可以,但是这样学效率太低了! 你要知道网络安全是一门技术,任何技术的学习一定是以实践为主的。也就是说很多的理论知识其实是可以在实践中…...
错误检测技术:奇偶校验
文章目录 参考描述奇校验与偶校验错误检测技术奇偶校验 奇校验与偶校验奇校验偶校验局限性漏网之鱼 奇偶校验的三种形式水平奇偶校验垂直奇偶校验水平垂直奇偶校验优劣漏网之鱼 参考 项目描述搜索引擎Google 、Bing百度百科奇偶校验计算机网络 基础与应用(微课版&a…...
语义版本控制规范(SemVer)
Semantic Versioning 2.0.0 官网 给出一个版本号MAJOR.MINOR.PATCH,增加如下: MAJOR version 进行不兼容的API更改时MINOR version 当您以向后兼容的方式添加功能时PATCH version 当您进行向后兼容的错误修复时 预发布(pre-release )和构建元数据的附…...
基于Flask的留言板的设计与实现
这是《Flask Web开发实战:入门、进阶与原理解析》这本书中的一个小项目,我在学习后根据书中的教程实现了留言板的功能,并结合我的思路将代码做了一些调整。 下面这是实现后的展示图片 文章目录 设计思路项目代码exts.pymodels.pyforms.pyerrors.pycomma…...
vmware 详细安装教程
一.VM是什么? VMware Workstation是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比,VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需…...
Python 爬虫工具
Python3 默认提供了urllib库,可以爬取网页信息,但其中确实有不方便的地方,如:处理网页验证和Cookies,以及Hander头信息处理。 为了更加方便处理,有了更为强大的库 urllib3 和 requests, 本节会分别介绍一下…...
再也不去字节跳动面试了,6年测开经验的真实面试经历.....
前几天我朋友跟我吐苦水,这波面试又把他打击到了,做了快6年软件测试员。。。为了进大厂,也花了很多时间和精力在面试准备上,也刷了很多题。但题刷多了之后有点怀疑人生,不知道刷的这些题在之后的工作中能不能用到&…...
第十五章 角色移动旋转实例
本章节我们创建一个“RoleDemoProject”工程,然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包,这个场景很大,大家需要调整场景视角才能看清。 接下来,我们添加一个人物模型,操作方式就是将模型文…...
问答类网站怎么做/百度怎么推广自己的作品
day02 for break 跳出循环,包括break后面的语句也不会再执行 // break for i : 0; i < 10; i {if i 5 {break // 跳出循环,包括break后面的语句也不会再执行}fmt.Println(i) } fmt.Println("overbreak")continue 当符合条件时&#x…...
织梦cms手机网站源码/怎么交换友情链接
在ThoughtWorks的日子(第-1天) Posted on 2008-12-07 15:17 勇敢的鸵鸟 阅读(6218) 评论(22) 编辑 收藏 明天就要去报到了。今天仍然很忙,校对那本挨千刀(Google拼音居然没有这个词,山东方言,自己领会吧&a…...
密云区住房和建设委员会网站/合肥网络公司排名
实现用本地的ssh隧道起到加密功能 在windows平台上运行Navicat for MySQL(http://www.navicat.com/ ) 1、连接connetcion进去设置 设置windows本地数据库账户和密码 2、 连接 linux平台ssh,设置服务器的账户和密码 上面配置好后,…...
一个外国人做的汉子 网站/网站为什么要seo?
前段时间做需求一直被一个问题困扰,就是banner图无缝拼接的兼容问题,尤其在一些大屏手机上很容易复现这个问题。 于是各种搜索,期望能找到解决办法,然而网上提供的诸如给img设置display:block;添加vertical-align:top;的方法完全…...
网站建设属于技术开发合同吗/网站查询seo
https://www.jb51.net/article/92575.htm...
网址大全2345色综合导航/最专业的seo公司
urllib-Python3文档链接致谢python修行路 1.初识urllib urllib库包含以下模块: urllib.request——打开和读取 URLsurllib.error——urllib.request异常处理urllib.parse——解码URLsurllib.robotparser——解码robots.txt 2.urllib爬虫 2.1 简单的get方法 简…...