算法篇:栈之常见题型
算法:
栈算是比较常见 的一种数据结构,先进后出,一般操作步骤如下:
1. 建立一个栈,golang中往往使用slice来操作
2. 满足条件的元素入栈
3. 出栈的时候一般都是最后一个入栈的元素,这里需要调节元素的位置
题目1: 有效的括号
https://leetcode-cn.com/problems/valid-parentheses/
代码实现:
func isValid(s string) bool {
if len(s)%2 == 1 {
return false
}
cc := []byte(s)
var satckStr []byte
for _, d := range cc {
if d == '(' || d== '{' || d == '[' {
satckStr = append(satckStr,d)
} else {
// ),],}这几个符号需要判断合法性
last := len(satckStr)-1
if ok := popStrOk(d,satckStr,last); !ok {
return false
}
satckStr = satckStr[:last]
}
}
if len(satckStr) != 0 {
return false
}
return true
}
func popStrOk(d byte, satckStr []byte, last int) bool{
if len(satckStr) == 0 {
return false
}
switch d {
case ')':
if satckStr[last] != '(' {
return false
}
case ']':
if satckStr[last] != '[' {
return false
}
case '}':
if satckStr[last] != '{' {
return false
}
default:
return false
}
return true
}
/*
解题思路:用栈来操作
1.先初步过滤掉数据,将奇数的字符串丢掉
2.遍历字符串,将(,[,{入栈
3.右括号出栈,判断是否有对应的做括号匹配(备注:考虑栈为空的时候)
4.都处理完了,栈非空为false,否则为true
*/
执行结果:
题目2: 删除最外层的括号
https://leetcode-cn.com/problems/remove-outermost-parentheses/
代码实现:
func removeOuterParentheses(S string) string {
strs := []byte(S)
len := len(strs)
L,R := 0,0
var stacks []byte
for i := 0; i < len; i++{
if strs[i]=='(' {
L++
} else {
R++
}
if R != L && L != 1{ // L==1表示的是最左边的左括号
stacks =append(stacks,strs[i])
} else if R == L { // 这个是最右边的右括号,不入栈
L,R = 0,0
}
}
return string(stacks)
}
/*
栈实现:利用左右括号的数量相同条件,
L == R的时候,表示的是找到了源语句
L!=R的时候,进行入栈,不过记得不要将最开始的左括号和最右边的右括号入栈
*/
执行结果:
题目3: 最小栈
https://leetcode-cn.com/problems/min-stack/
代码实现:
/*
关键点是最小值的获取,用栈
Mins作为一个有序数列,最后一位表示的是最小值,以第一次入栈的元素作为标识,
后续进来的元素小于等于它,放到数组末尾。
出栈的时候,只有出栈的数据是小于等于Mins中的最小元素的,才会出栈
备注:注意第一个入栈元素是必须要入栈的
*/
type MinStack struct {
Arr []int
Mins []int
}
/** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{}
}
func (this *MinStack) Push(x int) {
this.Arr = append(this.Arr,x)
if len(this.Mins) == 0 || x <= this.Mins[len(this.Mins)-1] {
this.Mins = append(this.Mins,x)
}
return
}
func (this *MinStack) Pop() {
if len(this.Arr) == 0 {
return
}
last := len(this.Arr)-1
if this.Arr[last] <= this.Mins[len(this.Mins)-1] {
this.Mins = this.Mins[:len(this.Mins)-1]
}
this.Arr = this.Arr[:last]
return
}
func (this *MinStack) Top() int {
return this.Arr[len(this.Arr)-1]
}
func (this *MinStack) GetMin() int {
return this.Mins[len(this.Mins)-1]
}
执行结果:
本文分享自微信公众号 - 灰子学技术(huizixueguoxue)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
终于开始了,微软的野心将通过全场景开发平台.NET 5体现得淋漓尽致!
现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面、移动、IOT、游戏、Web等平台的应用。这样对于开发人员是非常爽的。本文将介绍微软推出的开发平台:.net 5,这个开发平台将完美地满足我们的各种开发需求。.net 5也是.net家族的下一代产品。 我们只需要使用.net 5,就可以为Windows、Linux、macOS、iOS、Android、tvOS、watchOS、Web等平台开发应用,是不是很酷呢?本文会介绍一下.net 5的一些新特性。并亲手开发我们的第一个基于.net 5的程序。 从.NET Core项目开始以来,微软已经向该平台添加了大约五万个.NET Framework API。.NET Core 3.0为了缩小与.NET Framework 4.8的功能差距,添加了Windows Forms,WPF、Entity Framework6等功能。.NET5在此基础上,利用.NET Core和Mono的优势创建了一个单一平台,你可以将其用于所有的现存的.net代码,一个完整的与.net framework平齐的跨平台开发平台终于诞生了。 微软计划在2...
- 下一篇
10种常用的图算法直观可视化解释
图已经成为一种强大的建模和捕获真实场景中的数据的手段,比如社交媒体网络、网页和链接,以及GPS中的位置和路线。如果您有一组相互关联的对象,那么您可以使用图来表示它们。 在这篇文章中,我将简要地解释10个对分析和应用非常有用的基本图形算法。 首先,让我们介绍图。 什么是图? 图由一组有限的顶点或节点和一组连接这些顶点的边组成。如果两个顶点通过同一条边互相连接,则称它们为邻接。 下面给出了一些与图相关的基本定义。您可以参考图1中的示例。 Order:图中顶点的数量 Size:图中的边数 Vertex degree:与一个顶点关联的边的数量 Isolated vertex:图中与其他顶点没有连接的顶点 Self-loop:从顶点到自身的一条边 Directed graph:所有的边都有一个方向来表示起始点和结束点的图 Undirected graph:具有没有方向的边的图 Weighted grap:图的边具有权值 Unweighted graph:图的边没有权值 广度优先搜索(Breadth-first search) 遍历或搜索是可在图上执行的基本操作之一。在广度优先搜索(BFS)中,我...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Mario游戏-低调大师作品
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题