算法篇——栈与队列大集合(js版)

news2024/10/1 21:37:22

232.用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
链接:https://leetcode.cn/problems/implement-queue-using-stacks

var MyQueue = function() {
    this.in = [];
    this.out = [];
};
MyQueue.prototype.push = function(x) {
    this.in.push(x);
};
MyQueue.prototype.pop = function() {
    if(this.out.length) {
        return this.out.pop();
    }
    // 如果此时出队列为空,查看入队列是否为空,如果不为空,将入队列的元素返回
    while(this.in.length) {
        this.out.push(this.in.pop());
    }
    return this.out.pop();
};
MyQueue.prototype.peek = function() {
    var x = this.pop();
    this.out.push(x);
    return x;
};
MyQueue.prototype.empty = function() {
    if(this.in.length || this.out.length) return false;
    return true;
};

225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
链接:https://leetcode.cn/problems/implement-stack-using-queues

var MyStack = function() {
    this.q = [];
};
MyStack.prototype.push = function(x) {
    this.q.push(x);
};
MyStack.prototype.pop = function() {
    var size = this.q.length;
    while(size > 1) {
        this.q.push(this.q.shift());
        size--;
    }
    return this.q.shift();
};
MyStack.prototype.top = function() {
    var x = this.pop();
    this.q.push(x);
    return x;
};
MyStack.prototype.empty = function() {
    return !this.q.length;
};

 20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
链接:https://leetcode.cn/problems/valid-parentheses

var isValid = function(s) {
    const stack = [];
    const map = new Map([['(', ')'], ['[', ']'], ['{', '}']]);
    for(const x of s) {
        if(map.has(x)) {
            stack.push(x);
            continue;
        };
        if(map.get(stack.pop()) !== x) return false;
    }
    return !stack.length;
};

1047. 删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string

var removeDuplicates = function(s) {
    var res = [];
    for(var i = 0; i < s.length; i++) {
        // 如果当前遍历的元素和栈顶元素相同,就将栈顶元素出栈
        if(res[res.length-1] == s[i]) res.pop();
        // 否则就将当前的遍历元素入栈
        else res.push(s[i]);
    }
    return res.join("");
};

150. 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation

var evalRPN = function(tokens) {
    var res = [];
    for(var i = 0; i < tokens.length; i++) {
        // 遇到算符则取出栈顶两个数字进行计算
        if(tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/' ) {
            num1 = res.pop();
            num2 = res.pop();
            // 并将结果压入栈中
            if(tokens[i] == '+') res.push(num1+num2);
            else if(tokens[i] == '-') res.push(num2-num1);
            else if(tokens[i] == '*') res.push(num1*num2);
            // 除法考虑小数部分,所以直接去掉小数点后部分
            else if(tokens[i] == '/') res.push(parseInt(num2/num1));
        }
        // 遇到数字则入栈
        else res.push(Number(tokens[i]));
    }
    return res;
};

239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。
链接:https://leetcode.cn/problems/sliding-window-maximum

var maxSlidingWindow = function(nums, k) {
    var res = [];
    var list = [];
    for(var i = 0; i < nums.length; ++i) {
        // 队列为空时,入队当前元素的下标
        if(list.length == 0) list.push(i);
        else {
            // 如果队列长度比滑动窗口规定长度大,移除队首元素
            // 即当前遍历元素的下标与队首元素的下标之差必小于k-1(滑动窗口大小)
            while(i - list[0] > k - 1) list.shift();
            // 如果当前遍历的元素比队尾元素大,弹出队尾元素
            while(nums[i] >= nums[list[list.length-1]]) list.pop();
            // 否则将当前元素的角标入队
            list.push(i);
        }
        // 每滑动一次,将队首元素放入结果数组中
        if(i >= k-1) res.push(nums[list[0]]);
    }
    return res;
};

347.前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

链接:力扣

var topKFrequent = function(nums, k) {
    var map = new Map();
    var list = [];
    var myValue = [];
    for(var i of nums) {
        // key: 元素 value: 次数
        map.set(i, (map.get(i) || 0) + 1)
    }
    // 整理map的格式为[key, value]
    var arr = [...map.entries()];
    // 按照次数的大小进行降序排序,次数位于每个小数组的index=1
    list = arr.sort((count1, count2)=>{return count2[1]-count1[1]});
    // 将降序数组中的元素取出
    for(var i = 0; i < list.length; i++) {
        myValue.push(list[i][0]);
    }
    // 按照出现频率前 k 高截取元素
    return myValue.slice(0, k);
};

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

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

相关文章

SpringBoot集成Redis及问题解决

SpringBoot集成Redis 此篇文章为SpringBoot集成Redis的简单介绍&#xff0c;依赖、序列化操作、工具类都可以在后面的实操中直接搬运使用或者在此基础上进行改进使用 1、集成Redis 1.1、新建SpringBoot项目 新建项目这边就不一一介绍了&#xff0c;大家如果还有不会的可以自行…

【LeetCode】144.二叉树的前序遍历

1.问题 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1]…

七大排序的时间复杂度和空间复杂度

文章目录 七大排序的分类时间复杂度空间复杂度稳定性直接插入排序希尔排序选择排序堆排序冒泡排序快速排序归并排序总结 七大排序的分类 时间复杂度 时间复杂度是指一个程序中基本语句被执行的次数,一般认为是最坏情况。 空间复杂度 空间复杂度是指在一个程序执行时要额外开…

美团DAT:A Dual Augmented Two-tower Model for Online Large-scale Recommendation

A Dual Augmented Two-tower Model for Online Large-scale Recommendation 美团的对偶增强双塔为了user塔和item塔操碎了心&#xff0c;众所周知&#xff0c;双塔的一个大毛病就是item和user的交叉太晚&#xff0c;重要的信息经过层层神经网络的抽象提取&#xff0c;有些重要…

15、异常处理

文章目录 1、错误处理1、默认规则2、定制错误处理逻辑3、异常处理自动配置原理4、异常处理步骤流程 【尚硅谷】SpringBoot2零基础入门教程-讲师&#xff1a;雷丰阳 笔记 路还在继续&#xff0c;梦还在期许 1、错误处理 1、默认规则 默认情况下&#xff0c;Spring Boot提供/er…

傻傻的分不清 Comparator 和 Comparable 接口? 两分钟弄懂~

目录 一、Comparable 接口 二、Comparator 接口 一、Comparable 接口 Comparable 是一个排序接口&#xff08;意味着该支持排序&#xff09;&#xff0c;可以看作内比较器&#xff0c;也就是说可以和自己比较&#xff0c;通常用来自己属性与自己属性进行比较&#xff0c;最后通…

百年孤独 -- 有感

《创世记》之后&#xff0c;首部值得全人类阅读的文学巨著。 — 纽约时报 加西亚 马尔克斯以小说作品创建了一个自己的世界&#xff0c;一个浓缩的宇宙&#xff0c;其中喧嚣纷乱却又生动可信的现实&#xff0c;映射了一篇大陆及其人民的富足与贫困。 — 诺贝尔文学奖颁奖辞 马…

wordpress+apache搭建问题总结

访问首页出现服务器目录 需要到apache的httpd.conf 添加index.php默认值 更新失败。 此响应不是合法的JSON响应 大多出现于修改固定连接后 打开httpd.conf文件,把AllowOverride None修改为AllowOverride All,重启apache即可解决 AllowOverride Noneyi意味着忽略.htaccess文件…

VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)

VS2022中创建CSDK库(dll动态库)并调用SDK库(dll动态库) 一、说明 通过前两篇的文章我们知道了封装一个Qt下的SDK库&#xff08;dll动态链接库&#xff09;和封装Pimpl模式。 Qt创建SDK库(dll动态库)并调用SDK库(dll动态库) SDK(动态链接库dll)的封装技巧 本篇介绍在C VS下…

深度解析动态分配内存管理

目录 ​编辑 一. 前言 二.正文 2.0 计算机中的内存 2.1 动态申请函数头文件 2.2 malloc函数 2.3 free函数 2.3 calloc函数 2.4 realloc函数 2.5 经典笔试题 1. 2. 2.6 柔性数组 三.结语 一. 前言 本小节跟大家分享动态内存管理的知识&#xff0c;希望能给大家带…

2020年全国10m分辨率地表覆盖数据集

1.数据概况 地球观测技术的进步使得土地覆盖制图的空间分辨率不断提高&#xff0c;但这也导致了高分辨率影像样本收集和更新变得更加耗时。本研究提出了一种基于样本噪声学习的跨分辨率土地覆盖制图框架&#xff0c;利用现有低分辨率产品生成大量高分辨率影像标签用于深度语义…

【Python从入门到进阶】17、文件的读写操作

接上篇《16、文件的打开和关闭》 上一篇我们学习了Python打开和关闭文件的操作。本篇我们主要学习Python文件对象包含哪些方法&#xff0c;并学习文件如何进行读、写、定位和删除。 一、文件对象的属性和方法 通过上一篇的学习我们知道&#xff0c;open函数会返回给我们一个文…

一个简单的盒模型嵌套---一个大盒子里面嵌套两个中盒子,右边中盒子嵌套六个小盒子

html代码&#xff1a; <div class"box1"><div class"box2"></div><div class"box3"><div class"box4"></div><div class"box5"></div><div class"box6">&…

apple pencil值不值得购买?ipad平替电容笔安利

自从Apple Pencil上市后&#xff0c;平替电容笔在国内的销量&#xff0c;也是随之而增加&#xff0c;虽然Apple Pencil的性能不错&#xff0c;但由于其的价格太高&#xff0c;所以不少普通用户都买不起。现在市面上有很多能够代替苹果原装笔的平替电容笔。在这里&#xff0c;我…

Debezium系列之:自定义表级别Topic的名称

Debezium系列之:自定义表级别Topic的名称 一、需求背景二、去掉部分topic名称的方法三、debezium具体实现方法四、完整配置一、需求背景 debezium表级别Topic命名规则为:topic.prefix参数的值.数据库名称.表的名称现在支持实时需求,命名名称需要修改为topic.prefix参数的值.…

SAP KANBAN 从入门到放弃系列之生产补货模式

目录 系统操作 看板牌-生产补货 系统配置&#xff1a; 补充策略配置 看板状态配置 创建物料主数据 创建供应区域 创建控制周期-经典看板 系统操作 看板牌-生产补货 需要必要的看板配置和主数据设置 第一步&#xff1a;事务代码:PK13N&#xff0c;需求端KANBAN.供应端…

【数据库】 | 初始数据库

&#x1f397;️ 博客新人&#xff0c;希望大家一起加油进步 &#x1f397;️ 乾坤未定&#xff0c;你我皆黑马 目录 1、什么是数据库2、数据库分类3、 一些重要概念4、 数据存储 1、什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以…

访京东查询(自定义查询,组件形式,多页面使用,自定义查询条件)

1、效果图 2、使用了Ant Design of Vue里面的tag属性&#xff0c;也可以不用自己写样式。 3、代码模块 1、创建一个公共组件vue文件 <template><a-card size"small" :bordered"false" style"margin-bottom: 10px; padding:0px;">&l…

SVG格式文件可以用什么软件打开?

SVG是一种基于矢量的图像文件格式&#xff0c;通过基于网格上的点和线的数学公式存储图像&#xff0c;与 JPEG 等基于像素的位图文件不同。这种文件类型可以在不损失任何质量的情况下生成很小的文件&#xff0c;因而加载速度也相对更快&#xff0c;也使其成为LOGO和复杂在线图形…

SQL——多表连接查询

若一个查询同时涉及两个或两个以上的表&#xff0c; 则称之为连接查询&#xff08;在FROM子句中体现)。 参与连接的表可有多个&#xff0c;但连接操作在两个表之间进行&#xff0c;即两两连接。 连接查询包括&#xff1a; 内连接 等值连接&#xff1a;用“”比较被连接列的列值…