代码随想录复习 1047. 删除字符串中的所有相邻重复项 150 逆波兰表达式求值 239 滑动窗口最大值

本文介绍了三种编程算法:一是用栈实现删除字符串中的所有相邻重复项;二是通过栈计算逆波兰表达式的值;三是利用队列求解滑动窗口内的最大值问题。这些算法涉及数据结构的运用和高效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

代码如下 

func removeDuplicates(s string) string {

            var  stack []byte   //结果栈数组

            for i := 0 ; i < len(s) ; i++ {

                if len(stack) > 0 && stack[len(stack)-1] == s[i] {  //如果当前遍历到的元素与栈顶元素相同,那么就说明两个元素重复,要删除这两个元素。如果不相同,则保留当前遍历的元素

                    stack = stack[:len(stack)-1]

                }else {

                    stack = append(stack,s[i])

                }

            }

            return string(stack)

}

150 逆波兰表达式求值 

func evalRPN(tokens []string) int {

          stack := []int{}    //设置一个空的int数组

          for _,token  := range tokens { 遍历数组

              val , err := strconv.Atoi(token)  //将字符串数组转换为整形

              if err == nil {  //如果转换成功,则将这个整数放入stack数组中

                  stack = append(stack,val)

              }else { //如果转换失败,说明当前遍历到的元素是一个运算符

                  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]

}

239 滑动窗口最大值 

代码如下 

type myqueue struct {

    queue []int 

}

func newqueue() *myqueue {  //初始化

       return &myqueue {

           queue : make([]int,0),

       }

}

func (this *myqueue)front() int {

    return this.queue[0]    //获取队列最开头的元素

}

func (this *myqueue) back() int {

    return this.queue[len(this.queue)-1]  //获取队列最后一个元素

}

func (this *myqueue) empty() bool {  //判断是否为空 

    if len(this.queue) == 0 {    

        return true 

    }else {

        return false 

    }

}

func (this *myqueue) push(val int) {   //push的原则是,如果队列不为空,且队列的最后一个元素比将要push的元素小,那么需要把队列的元素移出。直到队列的最后一个元素比将要push进来的元素大,这样就确保了队列的首个元素一定是最大的元素

    for this.empty() == false && val > this.back() {

        this.queue = this.queue[:len(this.queue)-1]

    }

    this.queue = append(this.queue,val)

}

func (this *myqueue) pop(val int) {

    if this.empty() == false && val == this.front() {  //pop的原则是,如果这个将要pop的值和队列的最开头元素相同,就要把队列里的开头元素一起pop出去,否则不动队列里的元素

        this.queue = this.queue[1:]

    }

}






 

func maxSlidingWindow(nums []int, k int) []int {

           queue := newqueue()   //创建一个队列

           res := make([]int,0) 

           for i := 0 ; i < k ; i++ { //先收集前k个元素

               queue.push(nums[i])

           }

           res = append(res,queue.front()) //计算最大值

           for i := k ; i < len(nums) ; i++ {

               queue.pop(nums[i-k])  //将数组的元素从头pop出去

               queue.push(nums[i])  //从第k+1个元素开始push进来

               res = append(res,queue.front())  //每进行一次pop和push操作,计算一次最大值 

           }

           return res 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值