「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Golang の LeetCode: ブール式の解析

Golang の LeetCode: ブール式の解析

2024 年 11 月 8 日に公開
ブラウズ:447

これは、私が解決して楽しかった LeetCode の問題の 1 つです。私はそれを Golang で解決しました。私はすでに Go の初心者で、わずか 1 週間で Golang で学習を始めました。

LeetCode in Golang: Parsing A Boolean Expression

直感

この問題は、文字列を取得して評価する計算機プログラムの実装の別のバージョンです。最終結果が得られるまで、内側の括弧を外側の括弧に評価して解決する必要があります。これらの問題はスタックによって最もよく説明されます。新しい括弧を開くときにスタックにプッシュし、括弧を閉じるときにスタックからポップするという CallStack を実装しているだけです。最後の終了時に Eval を呼び出して最終結果を取得します。

電卓で実行できる操作は 3 つあり、それらについてはいくつかの既知の事実があります:

  • AND: false が見つかるまで true (false が 1 つあれば十分)
  • OR: true が見つかるまで false です (true が 1 つあれば十分です)
  • Not: 議論の反対です。

したがって、最終結果を知るために各操作のすべての値を維持する必要はありません。 AND を解決している場合、見つかった場合は維持するだけです。 false かどうか、OR の場合、true が見つかったかどうかを維持します。NOT の場合、それはすでに 1 つの値になり、その反対の値に評価されます。

アプローチ

カスタム構造体 CallStack を実装します。これには 2 つのスライスがあり、1 つは操作用、もう 1 つは評価する値用です。
呼び出しスタックにはメソッドがあります:

  • Push: 値と操作を 2 つのスライスにプッシュするために使用されます。操作は新しい値を 2 つのスライスにプッシュし、値 (t または f) は値スライスに最後に入力された値を変更するだけです。
  • Pop: 2 つのスライスから最後の値を削除し、ポップされた値をポップ操作で評価し、その結果を使用してポップ後の new の最後の値を変更します。
  • Eval: 操作スライス内の最後に残った操作を使用して値スライス内の最後に残った値を評価するために、最後の閉じ括弧のときに呼び出されます。

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 




          

            
        
リリースステートメント この記事は次の場所に転載されています: https://dev.to/ehab7osam/leetcode-in-golang-parsing-a-boolean-expression-3bl?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • Python で WebSocket を使用する
    Python で WebSocket を使用する
    WebSocketとは何ですか? WebSocket は、ブラウザとサーバー間のリアルタイムの双方向通信を可能にするプロトコルです。従来の HTTP 通信には、クライアントがリクエストを送信し、サーバーがデータ交換に応答することが含まれます。対照的に、WebSocket では、最初...
    プログラミング 2024 年 11 月 8 日に公開
  • PHP でサブドメインからドメイン名を抽出するにはどうすればよいですか?
    PHP でサブドメインからドメイン名を抽出するにはどうすればよいですか?
    PHP でサブドメインからドメイン名を抽出する現代の Web 開発では、サブドメインからであってもドメイン名を解析して取得することが不可欠です。 。簡単な例としては、「here.example.com」や「example.org」などのドメイン名が挙げられます。このニーズに対処するために、特定の入力...
    プログラミング 2024 年 11 月 8 日に公開
  • マルチスレッドプログラミングでベクトルを連結して効率を最適化するには?
    マルチスレッドプログラミングでベクトルを連結して効率を最適化するには?
    ベクトルの連結: 詳細な分析マルチスレッド プログラミングでは、結果の統合が一般的な課題です。これには通常、複数のベクトルを単一の包括的なベクトルに結合することが含まれます。最大限の効率を得るためにベクトルを連結するための最適なアプローチを探ってみましょう。最適な連結方法効率的なベクトル連結のベスト...
    プログラミング 2024 年 11 月 8 日に公開
  • 効率的に JSON データを返すために FastAPI を最適化するには?
    効率的に JSON データを返すために FastAPI を最適化するには?
    大規模な JSON データを返すための FastAPI の最適化FastAPI を通じて膨大な JSON データセットを返すのは、時間のかかる作業になる可能性があります。このボトルネックに対処するために、パフォーマンスを向上させる代替アプローチを検討します。ボトルネックの特定:json.dumps(...
    プログラミング 2024 年 11 月 8 日に公開
  • React: 状態 X 派生状態
    React: 状態 X 派生状態
    派生状態とは何ですか?テキストに対して 1 つの状態を考えてから、uppercaseText に対して別の状態を考えてください。 派生状態 function Foo() { const [text, setText] = useState('hello, za warudo!...
    プログラミング 2024 年 11 月 8 日に公開
  • カスタム ユーザー タイプを使用して PostgreSQL JSON 列を Hibernate エンティティにマップする方法
    カスタム ユーザー タイプを使用して PostgreSQL JSON 列を Hibernate エンティティにマップする方法
    PostgreSQL JSON 列を Hibernate エンティティにマッピングするPostgreSQL データベースを使用する場合、データを JSON 形式で保存する列に遭遇することがよくあります。 Hibernate を使用してこれらの列を Java エンティティに効果的にマップするには、適切...
    プログラミング 2024 年 11 月 8 日に公開
  • チーム全体で一貫した Node.js バージョンを確保する
    チーム全体で一貫した Node.js バージョンを確保する
    .nvmrc と package.json の包括的なガイド 今日の動的な開発状況では、さまざまなプロジェクトにわたって複数の Node.js バージョンを管理することは、多くの場合、複雑でエラーが発生しやすい作業になります。 Node.js のバージョンに一貫性がない場合、予期しない動作からアプリ...
    プログラミング 2024 年 11 月 8 日に公開
  • Promise.reject と JavaScript Promise をスローするのはどのような場合に使用するのですか?
    Promise.reject と JavaScript Promise をスローするのはどのような場合に使用するのですか?
    JavaScript Promises: Reject と Throw の謎JavaScript Promise を扱うとき、開発者はしばしばジレンマに直面します: Promise を使用すべきか.reject ですか、それとも単にエラーをスローしますか?どちらの方法も同様の目的を果たしますが、その...
    プログラミング 2024 年 11 月 8 日に公開
  • HTML 出力がレンダリングされずにプレーン テキストとして表示されるのはなぜですか?
    HTML 出力がレンダリングされずにプレーン テキストとして表示されるのはなぜですか?
    HTML 出力が HTML として受信されるのではなく、プレーン テキストとして解釈されるここでの質問は、HTML 出力が代わりにプレーン テキストとしてレンダリングされるシナリオに関するものです。適切な HTML として解析されるかどうか。基本的な Go 実装が提供されていますが、レンダリングされ...
    プログラミング 2024 年 11 月 8 日に公開
  • Chrome 拡張機能の構築 : 概要
    Chrome 拡張機能の構築 : 概要
    Mods—改造? ゲーム好きなら、改造されたゲームをプレイすることほど楽しいものはないことをご存知でしょう。お気に入りのゲームですが、さらなるパワー、機能、楽しさが備わっています。次に、同じ興奮を Web ブラウジング体験にもたらすことを想像してみてください。ブラウザ拡張機能はまさにそれです。ブラウ...
    プログラミング 2024 年 11 月 8 日に公開
  • CSSを使用してテーブルの列幅を設定するにはどうすればよいですか?
    CSSを使用してテーブルの列幅を設定するにはどうすればよいですか?
    テーブルの列幅の設定テーブルは一般に表形式のデータを表示するために使用されますが、読みやすさと適切性を確保するには列幅の調整が不可欠です。アライメント。この記事では、CSS を使用してテーブルの列の幅を設定する方法を説明します。CSS の width プロパティを使用する方法テーブルの列の幅は次のよ...
    プログラミング 2024 年 11 月 8 日に公開
  • Python の入れ子関数から非ローカル変数にアクセスする方法
    Python の入れ子関数から非ローカル変数にアクセスする方法
    入れ子関数スコープでの非ローカル変数へのアクセスPython では、入れ子関数スコープにより、外側のスコープへのアクセスが提供されます。ただし、入れ子になった関数内の囲みスコープ内の変数を変更しようとすると、UnboundLocalError が発生する可能性があります。この問題に対処するには、次の...
    プログラミング 2024 年 11 月 8 日に公開
  • CSSを使用してTEXTにグラデーションを適用します。
    CSSを使用してTEXTにグラデーションを適用します。
    テキストのグラデーション 今ではテキストのグラデーションなどの素敵なトリックがあちこちで見られるようになりました...でも?それらがどのように作られるのか疑問に思ったことはありますか?今日は私が教えてあげましょう。 .text-gradient { background: li...
    プログラミング 2024 年 11 月 8 日に公開
  • Python でカスタム間隔の丸めを実行するにはどうすればよいですか?
    Python でカスタム間隔の丸めを実行するにはどうすればよいですか?
    Python でのカスタム間隔への丸めPython では、組み込みのround() 関数が数値の丸めによく使用されます。ただし、10 進数の丸めスキームに基づいて動作するため、特定の要件に必ずしも適しているとは限りません。たとえば、数値を最も近い 5 の倍数に丸める場合、標準のround() 関数は...
    プログラミング 2024 年 11 月 8 日に公開
  • 項目 文字列の連結性能に注意する
    項目 文字列の連結性能に注意する
    1.演算子 ( ): を使用した文字列の連結 演算子を使用して文字列を連結すると、少数の連結には便利ですが、文字列の不変性により大規模な操作ではパフォーマンスの問題が発生します。 新しい文字列が作成されるたびに、以前のすべての文字列の内容がコピーされるため、大規模な連結では 2 次時間が発生します。...
    プログラミング 2024 年 11 月 8 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3