代码随想录day10|20有效的括号1047删除字符串中的所有相邻重复项150逆波兰表达式|01笔记

78 阅读2分钟
  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 这题是利用栈的特性,遇到左括号就压入,遇到右括号就弹出,还要注意不成立状况的逻辑。
  • 解题代码

  • 全展开逻辑
  •     func isValid(s string) bool {
            if len(s) % 2 != 0 {
                return false
            }
            st := make([]byte,0)
            for i:=0;i<len(s);i++ {
                if s[i] == '(' {
                    st = append(st, s[i])
                    continue
                }
                if s[i] == '[' {
                    st = append(st, s[i])
                    continue
                }
                if s[i] == '{' {
                    st = append(st, s[i])
                    continue
                }
                if s[i] == ')' {
                    if len(st)>0 {
                        if st[len(st)-1] == '(' {
                            st = st[:len(st)-1]
                            continue
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                }
                if s[i] == '}' {
                    if len(st)>0 {
                        if st[len(st)-1] == '{' {
                            st = st[:len(st)-1]
                            continue
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                }
                if s[i] == ']' {
                    if len(st)>0 {
                        if st[len(st)-1] == '[' {
                            st = st[:len(st)-1]
                            continue
                        } else {
                            return false
                        }
                    } else {
                        return false
                    }
                }
            }
            return len(st) == 0
        }
    
  • 利用map精简代码
  •     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.删除字符串中的所有相邻重复项

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 这题同”有效的括号“,是利用栈的特性进行匹配,最后留在栈里的字母就是应返回值。
  • 解题代码

  •     func removeDuplicates(s string) string {
            st := []byte{}
            for i:=0;i<len(s);i++{
                if len(st)>0 && s[i] == st[len(st)-1] {
                    st = st[:len(st)-1]
                } else {
                    st = append(st, s[i])
                }
            }
            return string(st)
        }
    
  • 150逆波兰表达式

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 后缀表达式的算法,利用栈来实现的过程就是遇到数值进行压入,遇到符号弹出前面两个值,运算后再压回。最后返回栈内值。
  • 解题代码及要点

  • 要注意字符与数字的转换,方便运算
  • golang中可以利用类型转换函数的err值来判断字符中是数字还是符号
  • 要注意运算时num1应是num2后弹出的。不然除法不正确
  • 利用swich语句
  •     func evalRPN(tokens []string) int {
        	stack := []int{}
        	for _, token := range tokens {
        		val, err := strconv.Atoi(token)
        		if err == nil {
        			stack = append(stack, val)
        		} else {   // 如果err不为nil说明不是数字
        			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]
        }