u
This commit is contained in:
@@ -2,42 +2,60 @@ package top100liked
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
// https://leetcode.cn/problems/decode-string/description/?envType=study-plan-v2&envId=top-100-liked
|
||||
// https://leetcode.cn/problems/min-stack/description/?envType=study-plan-v2&envId=top-100-liked
|
||||
|
||||
func decodeString(s string) string {
|
||||
curStr := ""
|
||||
curNum := 0
|
||||
strStack := []string{}
|
||||
numStack := []int{}
|
||||
for _, r := range s {
|
||||
if unicode.IsDigit(r) {
|
||||
curNum = curNum*10 + int(r-'0')
|
||||
} else if unicode.IsLetter(r) {
|
||||
curStr += string(r)
|
||||
} else if r == '[' {
|
||||
strStack = append(strStack, curStr)
|
||||
curStr = ""
|
||||
numStack = append(numStack, curNum)
|
||||
curNum = 0
|
||||
} else if r == ']' {
|
||||
num := numStack[len(numStack)-1]
|
||||
prevStr := strStack[len(strStack)-1]
|
||||
numStack = numStack[:len(numStack)-1]
|
||||
strStack = strStack[:len(strStack)-1]
|
||||
curStr = prevStr + strings.Repeat(curStr, num)
|
||||
}
|
||||
type MinStack struct {
|
||||
slice []int
|
||||
minSlice []int // 记录每个层级的最小值
|
||||
}
|
||||
|
||||
func Constructor() MinStack {
|
||||
return MinStack{}
|
||||
}
|
||||
|
||||
func (this *MinStack) Push(value int) {
|
||||
if len(this.slice) == 0 {
|
||||
this.minSlice = append(this.minSlice, value)
|
||||
} else {
|
||||
this.minSlice = append(this.minSlice, min(this.minSlice[len(this.minSlice)-1], value))
|
||||
}
|
||||
return curStr
|
||||
this.slice = append(this.slice, value)
|
||||
}
|
||||
|
||||
func Test(t *testing.T) {
|
||||
fmt.Println(decodeString("3[a]2[bc]"))
|
||||
fmt.Println(decodeString("3[a2[c]]"))
|
||||
fmt.Println(decodeString("2[abc]3[cd]ef"))
|
||||
fmt.Println(decodeString("abc3[cd]xyz"))
|
||||
func (this *MinStack) Pop() {
|
||||
this.slice = this.slice[:len(this.slice)-1]
|
||||
this.minSlice = this.minSlice[:len(this.minSlice)-1]
|
||||
}
|
||||
|
||||
func (this *MinStack) Top() int {
|
||||
return this.slice[len(this.slice)-1]
|
||||
}
|
||||
|
||||
func (this *MinStack) GetMin() int {
|
||||
return this.minSlice[len(this.minSlice)-1]
|
||||
}
|
||||
|
||||
func Test1(t *testing.T) {
|
||||
minStack := Constructor()
|
||||
minStack.Push(-2)
|
||||
minStack.Push(0)
|
||||
minStack.Push(-3)
|
||||
fmt.Println(minStack.GetMin())
|
||||
minStack.Pop()
|
||||
fmt.Println(minStack.Top())
|
||||
fmt.Println(minStack.GetMin())
|
||||
}
|
||||
|
||||
func Test2(t *testing.T) {
|
||||
minStack := Constructor()
|
||||
minStack.Push(1)
|
||||
minStack.Push(2)
|
||||
fmt.Println(minStack.Top())
|
||||
fmt.Println(minStack.GetMin())
|
||||
minStack.Pop()
|
||||
fmt.Println(minStack.GetMin())
|
||||
fmt.Println(minStack.Top())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user