これは、私が解決して楽しかった LeetCode の問題の 1 つです。私はそれを Golang で解決しました。私はすでに Go の初心者で、わずか 1 週間で Golang で学習を始めました。
この問題は、文字列を取得して評価する計算機プログラムの実装の別のバージョンです。最終結果が得られるまで、内側の括弧を外側の括弧に評価して解決する必要があります。これらの問題はスタックによって最もよく説明されます。新しい括弧を開くときにスタックにプッシュし、括弧を閉じるときにスタックからポップするという CallStack を実装しているだけです。最後の終了時に Eval を呼び出して最終結果を取得します。
電卓で実行できる操作は 3 つあり、それらについてはいくつかの既知の事実があります:
したがって、最終結果を知るために各操作のすべての値を維持する必要はありません。 AND を解決している場合、見つかった場合は維持するだけです。 false かどうか、OR の場合、true が見つかったかどうかを維持します。NOT の場合、それはすでに 1 つの値になり、その反対の値に評価されます。
カスタム構造体 CallStack を実装します。これには 2 つのスライスがあり、1 つは操作用、もう 1 つは評価する値用です。
呼び出しスタックにはメソッドがあります:
false が見つかったら Ands の評価を終了し、true が見つかったら Ors の評価を終了することで、ソリューションをより最適化できます。それは必要に応じて任せておきます :)
時間計算量:
の上)
空間の複雑さ:
の上)
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
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3