這是我喜歡解決的 LeetCode 問題之一。我用 Golang 解決了這個問題,而且我已經是一個 Go 新手了,剛開始學習一週。
這個問題是實現計算器程式的另一個版本,該程式接受一個字串並對其進行計算。您必須透過評估內部括號和外部括號來解決問題,直到您得到最終結果。這些問題最好用堆疊來描述,您只需實作一個 CallStack,當開啟新括號時,您將 Push 到堆疊,而當關閉它時,您只需從堆疊中 Pop 。最後關閉時我們呼叫 Eval 來獲得最終結果。
我們的計算器中有3個操作可以完成,並且有一些關於它們的已知事實:
所以,我們不需要維護每個操作的所有值來知道它的最終結果。 如果我們正在解決AND,只要找到一個是否為假,如果OR,則維持是否找到真值,如果NOT,那麼它已經是一個值,您將評估它的相反值。
我們實作一個自訂結構:CallStack,它有 2 個切片,一個用於操作,一個用於我們要評估的值。
呼叫堆疊有方法:
一旦發現錯誤,就結束 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