Este é um dos problemas do LeetCode que gostei de resolver. Resolvi em Golang e já sou um novato em Go, que comecei a aprender nele há apenas uma semana.
Este problema é outra versão da implementação de um programa de calculadora que pega uma string e a avalia. Você tem que resolver avaliando os parênteses internos com os externos até obter o resultado final. Esses problemas são melhor descritos por uma pilha, você está apenas implementando um CallStack que ao abrir um novo parêntese, você faz Push para a pilha, e ao fechá-lo você apenas faz Pop da pilha. No último fechamento chamamos Eval para obter o resultado final.
Temos 3 operações que podem ser feitas em nossa calculadora, e existem alguns fatos conhecidos sobre elas:
Portanto, não precisamos manter todos os valores de cada operação para saber seu resultado final. Se estivermos resolvendo um AND, apenas mantenha se você encontrou um falso ou não, se OR, mantenha se você encontrou um verdadeiro ou não, e se NOT, então já será um valor que você avaliará como oposto.
Implementamos uma estrutura customizada: CallStack, que possui 2 fatias, uma para a operação e outra para o valor que iremos avaliar.
A pilha de chamadas possui métodos:
A solução pode ser mais otimizada finalizando a avaliação de Ands assim que encontrar um falso, e de Ors quando encontrar um verdadeiro, deixarei isso para você fazer se quiser :)
Complexidade de tempo:
Sobre)
Complexidade do espaço:
Sobre)
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
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3