Este es uno de los problemas de LeetCode que disfruté resolviendo. Lo resolví en Golang y ya soy un novato en Go, que comencé a aprender en Golang desde hace solo una semana.
Este problema es otra versión de la implementación de un programa de calculadora que toma una cadena y la evalúa. Tienes que resolver evaluando los paréntesis internos con los externos hasta obtener el resultado final. Estos problemas se describen mejor mediante una pila; simplemente está implementando una CallStack que, al abrir un nuevo paréntesis, empuja a la pila y, al cerrarla, simplemente saca de la pila. En el último cierre llamamos a Eval para obtener el resultado final.
Tenemos 3 operaciones que se pueden realizar en nuestra calculadora, y hay algunos datos conocidos sobre ellas:
Por lo tanto, no necesitamos mantener todos los valores de cada operación para saber su resultado final. Si estamos resolviendo un Y, solo manténgalo si encontró un falso o no, si O, manténgalo si encontró verdadero o no, y si NO, entonces ya será un valor que evaluará a su opuesto.
Implementamos una estructura personalizada: CallStack, que tiene 2 cortes, uno para la operación y otro para el valor que vamos a evaluar.
La pila de llamadas tiene métodos:
La solución se puede optimizar más finalizando la evaluación de Ands una vez que encuentres un falso, y de Ors una vez que encuentres un verdadero, lo dejaré para que lo hagas si quieres :)
Complejidad del tiempo:
En)
Complejidad espacial:
En)
type CallStack struct { operations []string values []int } func NewCallStack() *CallStack { return &CallStack{ operations: make([]string, 0), values: make([]int, 0), } } func (s *CallStack) pushOperation(op string) { s.operations = append(s.operations, op) var newVal int switch op { case Not: newVal = 0 default: newVal = 1 } s.values = append(s.values, newVal) } func (s *CallStack) pushValue(op string, char string) { switch op { case And: if char == "f" { s.values[len(s.values)-1] = -1 } case Or: if char == "t" { s.values[len(s.values)-1] = -1 } default: // Not if char == "t" { s.values[len(s.values)-1] = 1 } else { s.values[len(s.values)-1] = -1 } } } func (s *CallStack) Push(char string) { switch char { case Not, And, Or: s.pushOperation(char) default: s.pushValue(s.operations[len(s.operations) - 1], char) } } func eval(op string, val int) bool { switch op { case And: if val == 1 { return true } else { return false } case Or: if val == -1 { return true } else { return false } default: // Not if val
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3