代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

对称匹配之后消除

20. 有效的括号
这道题我的思想是 是左括号就push进去,右括号就pop出来再匹配看看,(这块和大多数题解不太一样,他们都是用peek先看一下,如果符合情况在pop,也很巧妙,只是我脑子总是会用自己习惯的算法,大家自行选择哈)

一共有3种不符合条件的情况:
一开始想到的情况只有最普遍的那种:{ [ } ] 就是括号岔到一起了,但是长度至少是左右可以配上的。这样只要看到右括号,就和上一个比较就好
但是还有2种:
1: 长度不匹配:[ ] { { 遍历完了还有括号在栈里
2:[ ] } } 要去找 {,但是stack里已经空了,肯定会报错
3:{ { [ ] 情况同1
4:} } [ ] 情况同2

把这2种情况加进去,1&3 是遍历完成后直接检查Stack 是否为空,2&4是再每一次要Pop的时候,要保证stack不为空

1047. 删除字符串中的所有相邻重复项
建立一个stack:
首先 情况1:stack为空的话,要不就是一开始,要不就是刚刚pop干净。Action直接push即可.
情况2:遍历到的char等于里面peek的值,说明duplicated 情况出现,直接Pop掉即可
最后一个个Pop出来放到stringbuilder即可

然后咋就错了呢!!!

最后发现,啊! 好家伙!以为自己错在前一个逻辑上,没想到栽在了阴沟里,在循环的时候 我用的是stack的长度,但是他一旦Pop之后,肯定会发生变化,这样循环就不会按照我想要的次数进入: 解决方案: 用while( != is.Empty()) ,一步到位。 OR for 循环准备用之前把Size作为一个变量存起来。
还有最后的顺序,直接用rev 或者 在append的时候指定从Index = 0的地方插入即可

150. 逆波兰表达式求值
逻辑上并没有什么难的,加上这两天都是stack, 很容易会想到要这个题的考点是利用stack。

  • String 的相比是equals !!! equals() equals!!!
  • array 是木有 contain 功能的, 变成arrayList 再用contain, 或者看到题解直接用String的contains,更简单嗷!
    “+ -*/”.contains(x)
  • 栈里放的是Integer, 遇到operand 之后 就把前面2个拿出来,但是一定要注意运算方向!被除数和除数,减数和被减数!

应该这两天,栈的主要题目已经复习完了,每一天都会花掉大半天哪怕是简单题,说明确实自己这块还不太熟练,需要这周内再巩固一下。

大家一起加油嘚

你可能感兴趣的:(leetcode,小白的刷题之路,算法,leetcode,职场和发展)