[代码随想录]Day10-栈与队列part02
1.[代码随想录]Day01-数组part012.[代码随想录]Day02-数组part023.[代码随想录]Day06-哈希表 part024.[代码随想录]Day05-哈希表 part015.[代码随想录]Day04-链表part026.[代码随想录]Day03-链表part017.[代码随想录]Day14-二叉树part038.[代码随想录]Day13-二叉树part029.[代码随想录]Day12-二叉树part0110.[代码随想录]Day11-栈与队列part03
11.[代码随想录]Day10-栈与队列part02
12.[代码随想录]Day09-栈与队列part0113.[代码随想录]Day08-字符串 part0214.[代码随想录]Day07-字符串 part0115.[代码随想录]Day30-贪心算法part0416.[代码随想录]Day29-贪心算法part0317.[代码随想录]Day28-贪心算法part0218.[代码随想录]Day27-贪心算法part0119.[代码随想录]Day26-回溯算法part0620.[代码随想录]Day25-回溯算法part0521.[代码随想录]Day24-回溯算法part0422.[代码随想录]Day23-回溯算法part0323.[代码随想录]Day22-回溯算法part0224.[代码随想录]Day21-回溯算法part0125.[代码随想录]Day20-二叉树part0926.[代码随想录]Day19-二叉树part0827.[代码随想录]Day18-二叉树part0728.[代码随想录]Day17-二叉树part0629.[代码随想录]Day16-二叉树part0530.[代码随想录]Day15-二叉树part0431.[代码随想录]Day52-单调栈part0332.[代码随想录]Day51-单调栈part0233.[代码随想录]Day50-单调栈part0134.[代码随想录]Day49-动态规划part1735.[代码随想录]Day48-动态规划part1636.[代码随想录]Day47-动态规划part1537.[代码随想录]Day46-动态规划part1438.[代码随想录]Day45-动态规划part1339.[代码随想录]Day44-动态规划part1240.[代码随想录]Day43-动态规划part1141.[代码随想录]Day42-动态规划part1042.[代码随想录]Day41-动态规划part0943.[代码随想录]Day40-动态规划part0844.[代码随想录]Day39-动态规划part0745.[代码随想录]Day38-动态规划part0646.[代码随想录]Day37-动态规划part0547.[代码随想录]Day36-动态规划part0448.[代码随想录]Day35-动态规划part0349.[代码随想录]Day34-动态规划part0250.[代码随想录]Day33-动态规划part0151.[代码随想录]Day32-贪心算法part0652.[代码随想录]Day31-贪心算法part05题目:20. 有效的括号
思路:
很简单的一个栈的题目:
- 如果是左括号就存
- 如果是右括号就和栈顶的匹配
- 匹配失败就返回false
- 匹配成功就删除栈顶元素
- 如果结束后是空就说明匹配完成
这里需要注意的一个点是可以用map来代替过多的if else,希望能学会!
代码:
var pairs = map[byte]byte { // 做一个映射存储方便
')' : '(',
']' : '[',
'}' : '{',
}
func isValid(s string) bool {
stack := []byte{}
lens := 0 // 可以不用频繁的查询len(stack)
for i:=0; i < len(s); i++ {
if s[i] == '[' || s[i] == '{' || s[i] == '(' { // 左括号存
stack = append(stack, s[i])
lens++
}else if lens != 0 && stack[lens-1] == pairs[s[i]] { // 右括号匹配成功就删
stack = stack[:lens-1]
lens--
}else { // 匹配失败就false
return false
}
}
return lens == 0 // 是0才能true,因为可能剩下左括号
}
参考:
题目:1047. 删除字符串中的所有相邻重复项
思路:
和上面的题目一样都是匹配的问题,直接看注释
代码:
func removeDuplicates(s string) string {
stack := []byte{}
lens := 0
for i := 0; i < len(s); i++ {
if lens == 0 { // 如果还没有元素就直接添加
stack = append(stack, s[i])
lens++
}else if stack[lens-1] == s[i] { // 和上一个元素相同就删
stack = stack[:lens-1]
lens--
}else { // 和上一个不同就加
stack = append(stack, s[i])
lens++
}
}
return string(stack) // 转string类型
}
参考:
题目:150. 逆波兰表达式求值
思路:
题目不是很难,我要在这里学会的是如何去简化或者说提高代码的扩展性,比如对于运算符的判断以及对于加减乘除的计算。
详细看注释
代码:
var isOper = map[string]bool { // 判断是不是运算符
"+" : true,
"-" : true,
"*" : true,
"/" : true,
}
func evalRPN(tokens []string) int {
number := []int{}
lens := 0
for _, v := range tokens {
if _, ok := isOper[v]; ok { // 是运算符就操作
a := number[lens-2] // 取出倒数第二个数
b := number[lens-1] // 取出倒数第一个数
number[lens-2] = Calc(a, b, v) // 把结果存在倒数第二个位置
number = number[:lens-1] // 删除倒数第一个位置
lens-- // 元素-1
}else {
t, _:= strconv.Atoi(v) // string转int
number = append(number, t) // 添加到数字中
lens++ // 元素+1
}
}
return number[0] // 最后剩下一个元素就是结果
}
func Calc(a,b int, op string) int { // 根据运算符进行运算
if op == "+" {
return a + b
}else if op == "-" {
return a - b
}else if op == "*" {
return a * b
}else if op == "/" {
return a / b
}
return 0
}
参考:
合集:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!