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

这篇具有很好参考价值的文章主要介绍了代码随想录复习 1047. 删除字符串中的所有相邻重复项 150 逆波兰表达式求值 239 滑动窗口最大值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)

}文章来源地址https://www.toymoban.com/news/detail-445769.html

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 

}

到了这里,关于代码随想录复习 1047. 删除字符串中的所有相邻重复项 150 逆波兰表达式求值 239 滑动窗口最大值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录第五十六天——两个字符串的删除操作,编辑距离

    题目链接:两个字符串的删除操作 两个字符串可以相互删除 版本一: 确定dp数组及下标的含义 dp[i][j] :以i-1为结尾的字符串word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数 确定递推公式 (1)当word1[i - 1] 与 word2[j - 1]相同: (2)当word1[i - 1] 与

    2024年02月02日
    浏览(36)
  • 代码随想录打卡第56天|583. 两个字符串的删除操作;72. 编辑距离

    583. 两个字符串的删除操作 关键点1:dp数组的含义 dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数; 关键点2:递归公式的推导 if(nums1[i-1] == nums2[j-1]),则i和j同时移动,所以为i-1,j-1;dp[i][j] = dp[i-1][j-1];由于不需要进行删除操作,所以不需要加1 如果不相

    2023年04月19日
    浏览(48)
  • 代码随想录复习 151反转字符串中的单词242 有效的字母异位词 0-1背包问题

    代码如下  func reverseWords(s string) string {          b := []byte(s)             slowindex,fastindex := 0,0  //设置两个指着,快慢指针          for len(b)  0  fastindex  len(b)  b[fastindex] == \\\' \\\'{              fastindex++    //这里是取出开头的空格,逻辑是如果当

    2024年02月04日
    浏览(44)
  • 代码随想录笔记--字符串篇

    目录 1--反转字符串 2--反转字符串II 3--反转字符串中的单词 4--KMP算法 5--重复的子字符串 主要思路:         双指针算法,交换两个指针的字符; 主要思路:         以 2k 个字符为一组进行遍历; 主要思路1:         遍历提取每一个有效的单词,存储在一个栈中,最后遍

    2024年02月10日
    浏览(67)
  • 代码随想录 字符串 Java

    复杂度分析: 时间复杂度:O(N),其中N为字符数组的长度。一共执行了N/2次的交换 空间复杂度:O(1),只使用了常数空间来存放若干变量 我的思路:2k个字符为一组,先将前k个字符(或者不足k个字符)添加到StringBuilder中,然后调用reverse()方法,然后再将后k个字符(或者不足

    2024年02月06日
    浏览(39)
  • 代码随想录--字符串-反转字符串

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 示例 1: 输入:

    2024年02月09日
    浏览(52)
  • 代码随想录复习 203 移除链表元素

    代码如下  /**  * Definition for singly-linked list.  * type ListNode struct {  *     Val int  *     Next *ListNode  * }  */ func removeElements(head *ListNode, val int) *ListNode {              prehead := ListNode{}   //设置一个虚拟头结点                        prehead.Next 

    2024年02月03日
    浏览(50)
  • 代码随想录字符串专题复盘day15

    KMP算法 KMP算法的经典思想就是:当出现字符串不匹配的时候,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配 前缀表 next数组就是一个前缀表 前缀表是用来回退的,它记录了模式串与主串不匹配的时候,模式串应该从哪里开始重新匹配 前缀表的

    2024年01月20日
    浏览(47)
  • 代码随想录 Leetcode459. 重复的子字符串(KMP算法)

            此解法读者需要了解什么是KMP算法以及KMP算法中next数组的具体含义才能理解         因为在KMP算法的next数组中,next[index]表示 i ndex之前的最大长度的相同前缀后缀值 ,那么要判断整个字符串中是否由重复字串构成,只需要以下两个条件:         1.next[n - 1] !=

    2024年01月19日
    浏览(74)
  • 代码随想录day9|实现strStr()、重复的子字符串

    一般的字符串匹配问题我们可以使用KMP算法来处理,当我们搜索文本串和模式串是否匹配的时候,我们先得到模式串的一个前缀表,其中前缀表中存放的内容是模式串的最长相等前后缀。例如文本串为:aabaabaafa,模式串为:aabaaf,那么文本串的前缀表就是010120。当我们开始搜

    2024年02月15日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包