LeetCode en Golang : analyser une expression booléenne
C'est l'un des problèmes de LeetCode que j'ai aimé résoudre. Je l'ai résolu dans Golang, et je suis déjà un débutant en Go, qui a commencé à y apprendre depuis seulement une semaine.
Intuition
Ce problème est une autre version de l'implémentation d'un programme de calcul qui prend une chaîne et l'évalue. Vous devez résoudre en évaluant les parenthèses intérieures par rapport aux parenthèses extérieures jusqu'à ce que vous obteniez le résultat final. Ces problèmes sont mieux décrits par une pile, vous implémentez simplement un CallStack qui, lorsque vous ouvrez une nouvelle parenthèse, vous poussez vers la pile, et lorsque vous la fermez, vous sortez simplement de la pile. A la dernière clôture nous appelons Eval pour avoir le résultat final.
Nous avons 3 opérations qui peuvent être effectuées dans notre calculatrice, et il y a quelques faits connus à leur sujet :
- ET : c'est vrai jusqu'à ce que vous trouviez un faux (un faux suffit)
- OU : c'est faux jusqu'à ce qu'on trouve un vrai (un vrai suffit)
- Non : c'est le contraire de son argument.
Donc, nous n'avons pas besoin de conserver toutes les valeurs de chaque opération pour connaître son résultat final. Si nous résolvons un ET, maintenez simplement si vous avez trouvé un faux ou non, si OU, maintenez si vous avez trouvé un vrai ou non, et si NON, alors ce sera déjà une valeur que vous évaluerez par rapport à celle opposée.
Approche
Nous implémentons une structure personnalisée : CallStack, qui comporte 2 tranches, une pour l'opération et une pour la valeur que nous allons évaluer.
La pile d'appels a des méthodes :
- Push : utilisé pour pousser les valeurs et les opérations vers les 2 tranches que nous avons. Les opérations poussent une nouvelle valeur vers les 2 tranches, et les valeurs (t ou f) modifient simplement la dernière valeur saisie dans la tranche de valeurs.
- Pop : supprimez la dernière valeur des 2 tranches, évaluez la valeur sautée avec l'opération sautée et utilisez le résultat pour modifier la nouvelle dernière valeur après le popping.
- Eval : appelé lorsque c'est la dernière parenthèse fermante pour évaluer la dernière valeur restante dans la tranche des valeurs avec la dernière opération restante dans la tranche des opérations.
La solution peut être davantage optimisée en mettant fin à l'évaluation de Ands une fois que vous trouvez un faux, et de Ors une fois que vous trouvez un vrai, je vous laisse faire si vous le souhaitez :)
Complexité
Complexité temporelle :
O(n)Complexité spatiale :
O(n)
Code
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 < 0 { return true } else { return false } } } func addResult(op string, val int, res bool) int { switch op { case And: if res { return val } else { return -1 } case Or: if res { return -1 } else { return val } default: // Not if res { return 1 } else { return -1 } } } func (s *CallStack) Pop() { op := s.operations[len(s.operations)-1] s.operations = s.operations[:len(s.operations)-1] val := s.values[len(s.values)-1] s.values = s.values[:len(s.values)-1] result := eval(op, val) currOp := s.operations[len(s.operations)-1] // current last operation currVal := s.values[len(s.values)-1] // current last value s.values[len(s.values)-1] = addResult(currOp, currVal, result) } func (s *CallStack) Eval() bool { // now the length of slices is 1 op := s.operations[0] val := s.values[0] return eval(op, val) } const ( Not string = "!" And string = "&" Or string = "|" ) func parseBoolExpr(expression string) bool { stack := NewCallStack() for i := 0; i < len(expression); i++ { char := string(expression[i]) switch char { case "(", ",": // ignore opennings & commas continue case ")": if i == len(expression) - 1 { // it's the last closing return stack.Eval() } else { stack.Pop() } default: stack.Push(char) } } return true }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Golang est meilleur que Python en termes de performances et d'évolutivité. 1) Les caractéristiques de type compilation de Golang et le modèle de concurrence efficace le font bien fonctionner dans des scénarios de concurrence élevés. 2) Python, en tant que langue interprétée, s'exécute lentement, mais peut optimiser les performances via des outils tels que Cython.

Golang est meilleur que C en concurrence, tandis que C est meilleur que Golang en vitesse brute. 1) Golang obtient une concurrence efficace par le goroutine et le canal, ce qui convient à la gestion d'un grand nombre de tâches simultanées. 2) C Grâce à l'optimisation du compilateur et à la bibliothèque standard, il offre des performances élevées près du matériel, adaptées aux applications qui nécessitent une optimisation extrême.

GOISIDEALFORBEGINNERNERS et combinant pour pourcloudandNetWorkServicesDuetOtssimplicity, Efficiency, andCurrencyFeatures.1) InstallgofromTheofficialwebsiteandverifywith'goversion'..2)

Golang convient au développement rapide et aux scénarios simultanés, et C convient aux scénarios où des performances extrêmes et un contrôle de bas niveau sont nécessaires. 1) Golang améliore les performances grâce à des mécanismes de collecte et de concurrence des ordures, et convient au développement de services Web à haute concurrence. 2) C réalise les performances ultimes grâce à la gestion manuelle de la mémoire et à l'optimisation du compilateur, et convient au développement du système intégré.

Golang et Python ont chacun leurs propres avantages: Golang convient aux performances élevées et à la programmation simultanée, tandis que Python convient à la science des données et au développement Web. Golang est connu pour son modèle de concurrence et ses performances efficaces, tandis que Python est connu pour sa syntaxe concise et son écosystème de bibliothèque riche.

Les différences de performance entre Golang et C se reflètent principalement dans la gestion de la mémoire, l'optimisation de la compilation et l'efficacité du temps d'exécution. 1) Le mécanisme de collecte des ordures de Golang est pratique mais peut affecter les performances, 2) la gestion manuelle de C et l'optimisation du compilateur sont plus efficaces dans l'informatique récursive.

Golang et C ont chacun leurs propres avantages dans les compétitions de performance: 1) Golang convient à une concurrence élevée et à un développement rapide, et 2) C fournit des performances plus élevées et un contrôle fin. La sélection doit être basée sur les exigences du projet et la pile de technologie d'équipe.

GolangisidealforBuildingsCalableSystemsDuetoitSefficiency and Concurrency, tandis que les Implicites de l'Indrecosystem et le Golang'sDesignenCourageSlecElNCORES
