[20].有效的括号
题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
思路 遇见前半个括号加 后半个就弹出前半个 hash就是用来比较 有了后半个去比较前一位是不是前半个
总结 自己先写了一点 能跑但是跑不完,还是根据卡尔的写法改善了一下,我之前是来一个消一个 思路还行 但是没想到hash的写法 和前面一个比较对了再消,大致写法都相同
func isValid(s string) bool {
hash := map[byte]byte{')':'(', ']':'[', '}':'{'}
stack := make([]byte, 0)
if s == "" {
return true
}
for i := 0; i < len(s); i++ {
if s[i] == '(' || s[i] == '[' || s[i] == '{' {
stack = append(stack, s[i])
} else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] {
stack = stack[:len(stack)-1]
} else {
return false
}
}
return len(stack) == 0
}
[1047] .删除字符串中的所有相邻重复项
题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html
思路: 相等就消掉 ,不相等就往后添加
func removeDuplicates(s string) string {
stack := make([]byte, 0)
for i := 0; i < len(s); i++ {
if len(stack) > 0 && s[i] == stack[len(stack)-1] {
stack = stack[:len(stack)-1]
} else {
stack = append(stack, s[i])
}
}
return string(stack)
}
[150].逆波兰表达式求值
题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
思路 自己是没想到会有三个数再加 符号的情况 出现这总情况还是 len(s)-2 len(s)-1这样运算更好一点
func evalRPN(tokens []string) int {
stack:=make([]int, 0)
for _,token := range tokens {
val,err:=strconv.Atoi(token)
if err==nil{
stack = append(stack,val)
}else{
nums1,nums2 := stack[len(stack)-2],stack[len(stack)-1]
stack = stack[:len(stack)-2]
switch token {
case "+":
stack = append(stack,nums1+nums2)
case "-":
stack = append(stack,nums1-nums2)
case "*":
stack = append(stack,nums1*nums2)
case "/":
stack = append(stack,nums1/nums2)
}
}
}
return stack[0]
}
总结
今天的题都挺简单但是很多边界问题想不到