JavaScript刷LeetCode拿offer-js版字典

news2024/11/28 0:47:33

1. 字典简介

  • 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储。

  • 使用 ES6 Map

1.1 字典的常用操作

const m = new Map();

// 增
m.set('a', 'aa');
m.set('b', 'bb');

// 删
m.delete('b');
m.clear();

// 改
m.set('a', 'aaa')

// 查
m.get('a');


2. LeetCode: 349. 两个数组的交集

image.png

2.1 解题思路

  • 求nums1 和 nums2 多都有的值
  • 用字典建立一个映射关系,记录nums1里有的值
  • 遍历nums2,找出nums1 里也有的值

2.2 解题步骤

  • 新建一个字典,遍历nums1,填充字典
  • 遍历nums2, 遇到字典里的值就选出,并从字典中删除。
/** * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]} */
var intersection = function (nums1, nums2) {
    // 集合Set 实现方式
    // return [...new Set(nums1)].filter(item => nums2.includes(item))

    const map = new Map();
    nums1.forEach(n => {
        map.set(n, true)
    })
    const res = [];
    nums2.forEach(n => {
        if (map.get(n)) {
            res.push(n);
            map.delete(n);
        }
    })
    return res
};

3. LeetCode:20. 有效的括号

image.png

/** * @param {string} s
 * @return {boolean} */
var isValid = function (s) {
    if (s.length % 2 === 1) { return false }

    const stack = [];
    const map = new Map();
    map.set('(', ')')
    map.set('[', ']')
    map.set('{', '}')
    for (let i = 0; i < s.length; i += 1) {
        const c = s[i];
        if (c === '(' || c === '{' || c === '[') {
            stack.push(c)
        } else {
            const t = stack[stack.length - 1];
            if (
               map.get(t) === c
            ) {
                stack.pop();
            } else {
                return false;
            }
        }
    }
    return stack.length === 0;
};

4. LeetCode: 1. 两数之和

image.png

4.1 解题思路

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
  • 把nums 想象成相亲者
  • 把target 想象成匹配条件
  • 用字典建立一个婚姻介绍所,存储相亲者的数字和下标
  • 参考视频:传送门

4.2 解题步骤

  • 新建一个字典作为婚姻介绍所
  • nums 里的值,逐个来介绍找对象,没有何止的就先登记者,有合适的就牵手
/** * @param {number[]} nums
 * @param {number} target
 * @return {number[]} */
var twoSum = function (nums, target) {
    const map = new Map()
    for (let i = 0; i < nums.length; i += 1) {
        const n = nums[i];
        const n2 = target - n;
        if (map.has(n2)) {
            return [map.get(n2), i]
        } else {
            map.set(n, i)
        }
    }
};

执行用时:56 ms, 在所有 JavaScript 提交中击败了99.77%的用户

内存消耗:39.9 MB, 在所有 JavaScript 提交中击败了37.04%的用户

内存消耗为 O(n), 我们可以通过二分查找,用时间换空间的方式,进行处理

5. LeetCode: 3. 无重复字符的最长子串

5.1 题目描述

image.png

5.2 解题步骤

  • 用双指针维护一个滑动窗口,用来剪切子串
  • 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位。
  • 过程中,记录所有窗口的长度,并返回最大值。

5.3 代码实现

/** * @param {string} s
 * @return {number} */
var lengthOfLongestSubstring = function (s) {
    let l = 0; // 左指针位置
    let res = 0; // 定义返回结果
    const map = new Map();
    for (let r = 0; r < s.length; r += 1) {
        // r 右指针位置
        if (map.has(s[r]) && map.get(s[r]) >= l) {
            l = map.get(s[r]) + 1;
        }
        res = Math.max(res, r - l + 1)
        map.set(s[r], r)
    }
    return res;
};

  • 时间复杂度 O(n)
  • 空间复杂度 O(m)

6. LeetCode: 76. 最小覆盖子串

6.1 题目描述

image.png

6.2 解题思路

  • 先找出所有包含T的子串
  • 找出长度最小的那个子串,返回即可

6.3 解题步骤

  • 用双指针维护一个滑动窗口。
  • 移动右指针,找到包含T的子串,移动左指针,尽量减少包含T的子串的长度。

6.3 代码实现

/** * @param {string} s
 * @param {string} t
 * @return {string} */
var minWindow = function (s, t) {
    let l = 0;
    let r = 0;
    const need = new Map();
    for (let c of t) {
        need.set(c, need.has(c) ? need.get(c) + 1 : 1)
    }
    let needType = need.size;
    let res = '';
    while (r < s.length) {
        const c = s[r];
        if (need.has(c)) {
            need.set(c, need.get(c) - 1);
            if (need.get(c) === 0) needType -= 1;
        }
        while (needType === 0) {
            const newRes = s.substring(l, r + 1);
            if(!res || newRes.length < res.length) res = newRes;

            const c2 = s[l]
            if (need.has(c2)) {
                need.set(c2, need.get(c2) + 1)
                if (need.get(c2) === 1) needType += 1;
            }
            l += 1;
        }
        r += 1;
    }
    return res
};

  • 时间复杂度 O(m+n),m 是t的长度,n是s的长度
  • 空间复杂度 O(m)

7. 总结:

  • 与集合类似,字典也是一种存储唯一值的数据结构,但是它以键值对的形式来存储
  • ES6中有字典,名为Map
  • 字典的常用操作:键值对的增删改查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript 逆向】极验三代无感验证码逆向分析

相关文章 【JavaScript 逆向】极验三代滑块验证码逆向分析 【JavaScript 逆向】极验四代无感验证码逆向分析 【JavaScript 逆向】极验四代滑块验证码逆向分析 声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我…

ESP32设备驱动-HDC1008温度传感器驱动

HDC1008温度传感器驱动 1、HDC1008介绍 Texas Instruments 的 HDC1008 是一款带有集成温度传感器的数字湿度传感器,能够以极低的功耗提供出色的测量精度。 该设备基于新型电容传感器测量湿度。 湿度和温度传感器在出厂时已校准。 创新的 WLCSP(晶圆级芯片规模封装)使用超紧…

dubbo源码实践-Exchange 信息交换层例子

1 Exchange 层概述官方定义&#xff1a;exchange 信息交换层&#xff1a;封装请求响应模式&#xff0c;同步转异步&#xff0c;以 Request, Response 为中心&#xff0c;扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。其中Exchanger是SPI扩展点&…

虹科分享 | 网络流量监控 | 构建大型捕获文件(Ⅰ)——Wireshark过滤器和其他Allegro网络万用表工具

数据包分析是一个复杂的话题。如果在没有设置参数的情况下启动Wireshark&#xff0c;就会开始实时捕获或打开一个预先录制的pcap文件。在很短的时间内&#xff0c;可能有成千上万的数据包等待分析。有一种危险&#xff0c;就是被大量的数据困住了。 然而&#xff0c;如果用户想…

BPF学习笔记(八)--Linux tracing system对比分析

Linux trace技术发展已久&#xff0c;经常看到很多的专业术语&#xff0c;从perf LTTng systemtap bpftrace tracepoint trace BCC bpf ebpf等词汇&#xff0c;这些关键的词汇有着怎样的联系和关联&#xff0c;通过下面的这个图可以直观的认识到这几种关键技术的内在联系。 整…

Java认识多线程与Thread类的使用

目录 认识线程&#xff08;Thread&#xff09; 概念 为什么会有线程的出现&#xff1f; 刨根问底。为什么进程的创建与销毁效率很低呢&#xff1f; 多线程的轻量体现&#xff1a; 进程与线程的区别 第一个多线程程序 抢占式执行是啥 JDK中jconsole工具的使用 创建线程…

Live800:智能客服机器人的知识库怎么创建?

智能客服机器人的知识库是以知识为基础的系统&#xff0c;它可以明确地表达与实际问题相对应的知识&#xff0c;并构成相对独立的程序行为主体&#xff0c;有利于有效、准确地解决实际问题。从本质上来说&#xff0c;智能客服机器人的知识库实际上就像人类的大脑&#xff0c;储…

Flutter关于软键盘的一些问题

Scaffold类有个resizeToAvoidBottomInset 属性&#xff0c;它的作用是当弹出软键盘的时候&#xff0c;可以自动调节body区域的高度&#xff0c;撑起body的内容&#xff0c;使其底部高度刚好为键盘的高度&#xff0c;这样一来就不至于让键盘覆盖内容。 Scaffold( /// ..... ///…

教你如何搭建CRM—商机管理系统的demo

1、简介 1.1、案例简介 本文将介绍&#xff0c;如何搭建CRM-商机管理。 1.2、应用场景 CRM-商机管理应用完整记录所有商机资料&#xff0c;合理的对商机进行销售阶段的变更&#xff0c;实现商机管理智能化。 2、设置方法 2.1、表单搭建 1&#xff09;新建主表【商机】表…

进程间通信——共享内存

目录 1 概念 2 操作流程 fork(获取key值) shmget(申请对象) shmat(内存映射) 读写共享内存&#xff1a;类似堆区内存的直接读写 shmdt(解除映射) shmctl(删除对象) 范例&#xff1a; 1 概念 共享内存是进程间通信中最简单最高效的方式之一。共享内存允许两个或更多进程…

使用Python的Selenium进行网络自动化的入门教程

使用Python的Selenium进行网络自动化入门 自动化可以被看作是在使用电子机器或机器人来执行任务的过程中去除人力的过程。 在这篇文章中&#xff0c;我们将研究网络流程的自动化。 让软件机器人在网络上自动执行流程和任务的能力被称为网络自动化。 使用网络自动化&#xf…

2022年协议转让投资策略研究报告

第一章 协议转让的概念 协议转让是指双方当事人就转让标的物所有权达成协议&#xff0c;是典型的商业交易方式。而在破产案件中&#xff0c;则是一种有别于拍卖和以物抵债的处置财产的方式。根据《企业破产法》第112条&#xff0c;变价出售财产应当通过拍卖进行。但是&#xf…

云原生|kubernetes|安全漏扫神器trivy的部署和使用

前言&#xff1a; 云原生领域内的安全漏扫工具有clair和trivy是比较常用的&#xff0c;而安全漏扫工具是可以和harbor这样的私有仓库集成的&#xff0c;自harbor-1.21版以后都是默认使用trivy这个漏扫工具的&#xff0c;而在此之前是使用clair的。 那么&#xff0c;本文将就什…

实验十七 VLAN间的三层通信

实验十七 VLAN间的三层通信配置要求&#xff1a;通过三层交换机实现VLAN间互通通过单臂路由实现VLAN间互通网络拓扑图&#xff1a;操作步骤&#xff1a;一、 通过三层交换机实现VLAN间互通1、配置交换机LSW1的接口为trunk接口&#xff0c;g0/0/1口允许vlan 10通过&#xff0c;g…

构建器/生成器模式Builder

1.意图&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 2.结构 Builder为创建一个Product对象的各个部件指定抽象接口。 ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件&#xff0c;定义并明确它所创建的…

实验十五 IS-IS协议基本配置

实验十五 IS-IS协议基本配置IS-IS(中间系统到中间系统)协议与OSPF(开放最短路径优先)协议有许多类似之处&#xff0c; 如都是链路状态的IGP路由协议&#xff0c;采用的都SPF路由算法&#xff0c;都划分了区域。为了支持大规模 的路由网络&#xff0c;IS-IS在自治系统内采用骨丁…

四、MySQL 存储引擎及数据类型

文章目录一、前置知识二、MySQL 存储引擎(先了解&#xff0c;初步有个印象)2.1 MySQL 存储引擎的概念2.2 查询 MySQL 中支持的存储引擎2.3 InnoDB 存储引擎2.4 MyISAM 存储引擎2.5 MEMORY 存储引擎2.6 如何选择 MySQL 存储引擎&#xff1f;三、MySQL 数据类型3.1 数字类型3.2 日…

Dataway让SpringBoot不在需要Controller、Service、DAO、Mapper了

Dataway介绍 Dataway 是基于 DataQL 服务聚合能力&#xff0c;为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用…

君子签用区块链打造电子合同证据链闭环,提升电子合同证据效力

电子合同作为电子证据的主要表现形式&#xff0c;采用电子合同发生纠纷时&#xff0c;相关的电子合同数据成为证据证明的关键。运用区块链去中心化、分布式存储、加密可溯源等技术特性&#xff0c;让电子合同的整个过程都可以在互联网上安全地进行&#xff0c;帮助打通数据信任…

JavaERP系统源码+数据库,业务闭环、灵活稳定的企业级ERP系统,真正的财务业务一体化系统

JavaERP系统源码数据库&#xff0c;业务闭环、灵活稳定的企业级ERP系统&#xff0c;真正的财务业务一体化系统 完整代码下载地址&#xff1a;JavaERP系统源码数据库 产品展示 社区版 主界面 权限模块 职员与组织 科目结构 库存管理 库存盘点 订单管理 出入库管理 凭…