day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值

今日任务 

  • 20 有效的括号 (题目: . - 力扣(LeetCode))
  • 1047 删除字符串中的所有相邻重复项 (题目:  . - 力扣(LeetCode))
  • 150 逆波兰表达式求值 (题目: . - 力扣(LeetCode))

20 有效的括号 

        题目: . - 力扣(LeetCode)

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

想法:

        非常经典的一道题, 在大学课堂上老师就讲过这道题, 对栈的理解及应用, 思路比较清晰,题意其实就像我们在写代码的过程中,要求括号的顺序是一样的,有左括号,相应的位置必须要有右括号。

问题:

        有思路,手生,代码写错了一坨🤣、还有就是未习惯用基础数据类型如何模拟其他数据结构, 愣是没想着用切片模拟栈的基础行为; 还停留在我要不要先实现个栈,再操作.

解决思路:

        Go 语言,定义一个切片来当做栈.

        (1)遍历字符串, 遇到左括号就加入栈

        (2)遇到右括号,就判断是否和栈顶元素匹配,不匹配的话,直接 return false.因为当前的右括号必须和前一个匹配. 匹配之后,记得将栈顶元素弹出,进入下一个 for 循环.

        (3) 若字符串遍历完, 栈中还有元素,false; 

// 用切片模拟栈,来实现,就是碰到是左括号的就入栈、
// 碰到右括号,栈为空或者栈顶元素不是相匹配的就 return false.
// 匹配的话,就将栈顶元素移除,然后 for 循环也进入下一步.
// 如果 for 循环完了,栈还有数据,也要 return false
func isValid(s string) bool{
    // m 用来记录左右括号的匹配关系
    m := make(map[rune]rune)
    m[')'] = '('
    m['}'] = '{'
    m[']'] = '['

    stack := make([]rune,0)
    for _,v := range s{
        if v == '(' || v == '{' || v == '[' {
            // 左括号压入栈
            stack = append(stack,v)
        } else {
            // 右括号时,若栈内无匹配元素,则 false
            if len(stack) == 0 {
                return false
            }
            if stack[len(stack)-1] != m[v] {
                return false
            }
            // 模拟弹出栈顶元素
            stack = stack[0:len(stack)-1]
        }
    }
    if len(stack) != 0{
        return false
    }
    return true
}

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

 题目:. - 力扣(LeetCode)

        给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。

想法:

        和上题 有效的括号一样, 甚至更简单了, 只要当前元素和栈顶元素相等,将栈顶元素弹出就可以下一循环

问题:

        无问题,easy  

解决思路:

        Go 语言,定义一个切片来当做栈.

        (1)遍历字符串, 若栈未空,将当前元素加入栈. 栈不空,则对比栈顶元素是否相等,相等就将栈顶元素弹出. 

        (3) 若字符串遍历完, 将栈内元素拼接转为字符串即可.

func removeDuplicates(s string) string {
	stack := make([]rune, 0)
	for _, v := range s {
        // 如果栈里没有元素,就将当前元素压入栈
		if len(stack) == 0 {
			stack = append(stack, v)
			continue
		}
        // 如果当前元素与栈顶相同,就将栈顶元素移除
		if stack[len(stack)-1] == v {
			stack = stack[0 : len(stack)-1]
			continue
		}
        // 否则就将元素压栈
		stack = append(stack, v)
	}
	return string(stack)
}

150 逆波兰表达式求值

        题目: . - 力扣(LeetCode)

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

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

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

想法:

        一开始看题目有点没太理解, 看到了逆波兰表达式的解释,也能想到会用栈,但是我的想法错误. 我一直盯着最后面的字符串往前看,想取到最后一个字符,我要往前找两个数字字符.去进行运算.

问题:

         上面标红线的思路理解后,代码也是非常简单, 最大的困难可能看到那么多数字和 运算符号混在一起容易吓到. 不知道该如何处理了

解决思路:

        有张图挺好的, 看一眼就能直接理解了,参考自: 代码随想录

       

我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。

例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法,你说麻不麻烦!

那么将中缀表达式,转化为后缀表达式之后:["4", "13", "5", "/", "+"] ,就不一样了,计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的。

func evalRPN(tokens []string) int {
	stack := []int{}
	for _, token := range tokens {
		val, err := strconv.Atoi(token)
        // 如果没报错,说明是数字
		if err == nil {
			stack = append(stack, val)
		} else {   
            // 如果err不为nil说明不是数字
            // 取栈顶的前两个元素 等会做运算,并将其从栈中弹出
			num1, num2 := stack[len(stack)-2], stack[(len(stack))-1]
			stack = stack[:len(stack)-2]
			switch token {
			case "+":
				stack = append(stack, num1+num2)
			case "-":
				stack = append(stack, num1-num2)
			case "*":
				stack = append(stack, num1*num2)
			case "/":
				stack = append(stack, num1/num2)
			}
		}
	}
	return stack[0]
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习第34周周报VBAED

文章目录 week34 VBAED摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 序列问题阐述3.2 变分模态分解3.3 具有 BiLSTM 和双向输入注意力的编码器3.4 具有 BiLSTM 和双向时间注意力的解码器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集数据预处…

AI大模型之idea通义灵码智能AI插件安装方式

问题描述 主要讲述如何进行开发工具 idea中如何进行通义灵码的插件的安装解决方案 直接在idea的plugin市场中安装 下载插件之后进行安装 见资源

【QT+QGIS跨平台编译】161:【qgispython跨平台编译】—【qgis_python.h生成】

点击查看专栏目录 文章目录 一、qgis_python.h介绍二、信息分析三、qgis_python.h生成一、qgis_python.h介绍 qgis_python.h 是 QGIS(Quantum Geographic Information System)GIS 软件的一个头文件。QGIS 是一个开源的地理信息系统软件,提供了丰富的地图制图和空间分析功能。…

Google最新论文: 复杂的 Prompt 如何更好的调试?

本文介绍了Sequence Salience,这是一个专为调试复杂的大模型提示而设计的系统。该系统利用广泛使用的显著性方法,支持文本分类和单标记预测,并将其扩展到可处理长文本的调试系统。现有的工具往往不足以处理长文本或复杂提示的调试需求。尽管存…

ASP.NET公交车管理系统的实现与设计

摘 要 随着经济的日益增长,信息化时代已经到来,生活中各种信息趋向数字化、清晰化。公交车作为现代城市生活中一种重要的交通工具,其数量增多,车型也不再单一,雇用的司机增多,这样使得公交车公司的车辆信…

架构师系列-搜索引擎ElasticSearch(四)- 高级查询

ES查询 matchAll 脚本方式 该方式可以通过kabana、curl、elasticsearch-head(纯前端)去操作 # 默认情况下,es一次展示10条数据,通过from和size来控制分页 # 查询结果详解 GET goods/_search {"query": {"match_all":…

计算机网络 实验指导 实验17

实验17 配置无线网络实验 1.实验拓扑图 Table PC0 和 Table PC1 最开始可能还会连Access Point0,无影响后面会改 名称接口IP地址网关地址Router0fa0/0210.10.10.1fa0/1220.10.10.2Tablet PC0210.10.10.11Tablet PC1210.10.10.12Wireless互联网220.10.10.2LAN192.16…

JavaScript(六)-高级篇

文章目录 作用域局部作用域全局作用域作用域链JS垃圾回收机制闭包变量提升 函数进阶函数提升函数参数动态参数多余参数 箭头函数 解构赋值数组解构对象解构 遍历数组forEach方法(重点)构造函数深入对象创建对象的三种方式构造函数实例成员 & 静态成员…

舒欣上门预约系统源码-按摩预约/家政预约全行业适用-小程序/h5/app

上门预约或者到店预约均可,家政,按摩,等等上门类行业均可适用。(后台的技师及前台技师这两个字是可以更改的,例如改成家政老师,保洁,等等) 视频教程是演示搭建的小程序端&#xff0c…

Leetcode 235. 二叉搜索树的最近公共祖先

心路历程: 这道题可以完全按照二叉树的公共祖先来做,但是由于题目中给了二分搜索树的条件,因此可以通过值的大小简化左右子树的递归搜索。 解法一:按照二分搜索树的性质 # Definition for a binary tree node. # class TreeNod…

【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?

Step: 配置ssh的服务端host (也可以直接在vscode中配置,忽略) 主要步骤:在~/.ssh/config中添加服务端的host,以便vscode的remote中能够登录 详细配置过程参考兄弟篇文章:ssh config如何配置用host名替代ro…

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning 1. 文章简介2. 方法介绍 1. Overview2. 原理说明 1. SGD上的定义2. Adam上的定义 3. 具体实现 1. Overview1. LoRA使用2. 数据选择3. LESS-T 3. 实验考察 & 结论 1. 实验设计2. 主…

Jmeter三个常用组件

Jmeter三个常用组件 一、线程组二、 HTTP请求三、查看结果树 线程组:jmeter是基于线程来运行的,线程组主要用来管理线程的数量,线程的执行策略。 HTTP请求:HTTP请求是jmeter接口测试的核心部分,主要使用HTTP取样器来发…

PyQt5

Qt是基于C实现的GUI,而PyQt就是用python调用Qt. PyQt中有很多的功能模块,开发最常用的模块功能主要有3个 1) QtCore:包含核心的非GHI的功能,主要和时间,文件与文件夹,各种数据,流,URLs,进程与线程一起使用 2) QtGUi:包含窗口系统,事件处理,2D图像,基本绘画,字体和文字类 3)…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大…

【opencv】示例-stiching_detailed.cpp 使用OpenCV进行图像拼接的整体流程

#include <iostream> // 引入输入输出流库 #include <fstream> // 引入文件流库&#xff0c;用于文件输入输出 #include <string> // 引入字符串库 #include "opencv2/opencv_modules.hpp" // 引入OpenCV模块 #include <opencv2/core/utility.h…

【微信小程序——开发DAY4(黑马程序员课程)】

学习目标 自定义小程序组件自定义组件&#xff08;1.&#xff09;创建自定义组件文件夹&#xff08;2.&#xff09;引用自定义组件&#xff08;3.&#xff09;组件和页面的区别&#xff08;4.&#xff09;自定义组件的隔离性——自定义组件不影响小程序的样式——自定义组件也只…

用通俗易懂的方式讲解:大模型高级 RAG 检索策略之递归检索

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 基于大模…

LinkSage:基于 GNN 的 Pinterest理解

目录 一、背景二、动机和介绍三、技术设计3.1 数据3.2 图3.3 特征3.4 型 四、主要创新4.1 多维表示4.2 XSage的兼容性4.3 增量服务 五、离线结果5.1 召回5.2 分数分布5.3 峰度 六、在线结果6.1 面向用户的表面6.2 Ads 七、总结 LinkSage&#xff1a;基于图神经网络的Pinterest…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…