今日题目:
20. 有效的括号
1047. 删除字符串中的所有相邻重复项
150. 逆波兰表达式求值
今日总结
碰到与相邻元素匹配的题目首先想到用栈,因为栈能够很好地记录之前访问的元素.今天的题目都不难,注意下怎么处理入栈的第一个元素。
20. 有效的括号
要点
- 注意数据类型的转换
- 要注意有些情况是可以提前判断不合法的,不一定要遍历完字符串所有元素
代码:
func isValid(s string) bool {
if len(s) == 0 {
return false
}
stack := []byte{}
for i := 0; i < len(s); i++ {
if isLeft(s[i]) {
stack = append(stack, s[i])
} else {
if len(stack) == 0 {
return false
}
top := stack[len(stack)-1]
if (top == '(' && s[i] == ')') ||
(top == '[' && s[i] == ']') ||
(top == '{' && s[i] == '}') {
stack = stack[:len(stack)-1]
} else {
return false
}
}
}
return len(stack) == 0
}
func isLeft(ch byte) bool {
return ch == '(' || ch == '{' || ch == '['
}
1047. 删除字符串中的所有相邻重复项
要点:
- 简单,用栈就行
- 让我想到了有个叫星球碰撞的题目。这个题目简单在于每个元素进栈时只需要考虑栈顶就行,但是那道题有个一直向栈底部碰撞的过程。
代码:
func removeDuplicates(s string) string {
if len(s) == 0 {
return ""
}
stack := []byte{s[0]}
for i := 1; 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. 逆波兰表达式求值
要点:
- 想到用栈即可
- 注意这种用switch简化代码的写法
代码:
func evalRPN(tokens []string) int {
if len(tokens) == 0 {
return 0
}
stack := []int{}
for _, token := range tokens {
switch token {
case "+":
b := stack[len(stack)-1]
a := stack[len(stack)-2]
stack = stack[:len(stack)-2]
stack = append(stack, a+b)
case "-":
b := stack[len(stack)-1]
a := stack[len(stack)-2]
stack = stack[:len(stack)-2]
stack = append(stack, a-b)
case "*":
b := stack[len(stack)-1]
a := stack[len(stack)-2]
stack = stack[:len(stack)-2]
stack = append(stack, a*b)
case "/":
b := stack[len(stack)-1]
a := stack[len(stack)-2]
stack = stack[:len(stack)-2]
stack = append(stack, a/b)
default:
num, _ := strconv.Atoi(token)
stack = append(stack, num)
}
}
return stack[0]
}