Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】LeetCode Day 8 — Compare Version Numbers (165)

2025年09月23日に「Dev.to」が公開したITニュース「LeetCode Day 8 — Compare Version Numbers (165)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

LeetCodeの「バージョン番号比較」問題に挑戦した。この問題は文字列解析が鍵で、先行ゼロや欠落リビジョンの扱い、異なるリビジョン長の比較が重要だ。JavaScriptで文字列を分割し、各部分を整数として比較、足りない部分を0として処理した。継続が大切だと学んだ。

ITニュース解説

システム開発において、ソフトウェアのバージョン管理は非常に重要だ。新しい機能の追加やバグの修正が行われるたびに、ソフトウェアには新しいバージョン番号が割り当てられる。例えば、「1.0.0」から「1.0.1」へ、あるいは「1.1.0」へと更新されていくのを見たことがあるだろう。このようなバージョン番号を比較する機能は、例えばユーザーのソフトウェアが最新かどうかを確認したり、特定のバージョンよりも古いものには対応しないといった処理を行う際に不可欠となる。

LeetCodeの「Compare Version Numbers (165)」という問題は、まさにこのバージョン番号の比較ロジックを実装する挑戦だ。一見すると単純な文字列の比較に見えるかもしれないが、実はいくつかの「細かいルール」を正しく処理しなければならない点が、この問題の面白さと難しさの鍵となる。システムエンジニアを目指す上で、このような細部への注意と正確な実装能力は非常に重要だから、この問題から得られる学びは大きい。

この問題で特に注意が必要な点は主に三つある。一つ目は「先頭のゼロを無視する」というルールだ。例えば、「01」と「001」というバージョン番号の一部は、どちらも「1」として扱われるべきだ。通常の文字列比較では「01」と「001」は異なる文字列だが、バージョン番号においては数値として意味を持つため、先頭のゼロは単なる表示形式であり、実際の値には影響を与えない。このため、比較を行う際には、これらの部分をまず整数に変換して比較する必要がある。

二つ目は「省略されたリビジョンを0として扱う」というルールだ。バージョン番号は「メジャー.マイナー.パッチ」のように複数の数字をドットで区切って表現されることが多い。例えば、「1.0」と「1.0.0」は同じバージョンとして扱われるべきだ。「1.0」は「1.0.0」と解釈され、省略されたパッチバージョンは「0」とみなされる。これにより、バージョン番号の長さが異なる場合でも、適切な比較が可能になる。このルールを適用しないと、「1.0」と「1.0.0」が異なるものとして扱われてしまい、意図しない結果を招く可能性がある。

そして三つ目は「リビジョンの長さが異なる場合の比較」だ。上記の二つ目のルールと関連するが、例えば「1.0」と「1.0.1」を比較する場合、最初から順に各リビジョンを比較していく必要がある。まず「1」と「1」を比較し、同じなら次のリビジョンへ進む。次に「0」と「0」を比較し、これも同じ。そして「1.0」にはこれ以上リビジョンがないため、残りの部分を「0」として扱う。つまり、「1.0.0」と「1.0.1」を比較することになる。この場合、「0」と「1」を比較し、「1」の方が大きいと判断される。このように、バージョン番号の長さに違いがあっても、最後の部分まで正しく比較を継続するロジックが必要となる。

この問題を解決するための一般的なアプローチは、まずバージョン番号の文字列をドット(.)で分割し、それぞれのリビジョン番号を独立した要素として扱うことだ。例えば、「1.0.1」という文字列は、「1」「0」「1」という三つの要素からなる配列として捉えることができる。次に、二つのバージョン番号それぞれの配列を、先頭から順に要素を一つずつ取り出して比較していく。

比較の際には、各要素を文字列としてではなく、整数として扱うことが重要だ。これにより、「01」と「1」が同じ値として比較されるようになる。例えば、parseInt()のような関数を使用して、文字列を数値に変換する処理が必要となるだろう。

そして、片方のバージョン番号の要素がもう一方よりも早く尽きてしまった場合、その尽きた側の残りの要素はすべて「0」であるとみなして比較を続ける。これは、先に述べた「省略されたリビジョンを0として扱う」ルールを実装する方法だ。例えば、バージョンAが「1.0」で、バージョンBが「1.0.1」の場合、バージョンAの3番目のリビジョンは「0」として扱い、バージョンBの3番目のリビジョン「1」と比較する。これにより、両方のバージョン番号のすべてのリビジョンが比較されるまで処理を継続できる。

最終的に、比較を終えて、もし途中でどちらかのバージョンがもう一方より大きいと判断されれば、それが結果となる。すべて同じであれば、二つのバージョン番号は等しいと判断される。

このような問題に取り組むことは、システムエンジニアにとって非常に価値がある。なぜなら、ソフトウェア開発の現場では、単に機能を実現するだけでなく、今回のような「エッジケース」や「細かいルール」をいかに正確に、そして効率的に処理するかが、システムの信頼性や品質を大きく左右するからだ。文字列操作や数値変換、配列の扱いといった基本的なプログラミングスキルはもちろんのこと、問題の要件を正確に理解し、それらをコードに落とし込む論理的思考力が養われる。

LeetCodeのようなプログラミングチャレンジサイトは、このような実践的な問題解決能力を向上させるための絶好の訓練場となる。今回の記事の筆者が「集中できない日でも連続記録(streak)を続けることが重要」と述べているように、地道な努力を続けることが、やがて大きなスキルアップへと繋がるのだ。システムエンジニアとしてのキャリアを築く上で、常に新しい課題に挑戦し、解決策を導き出す経験は、かけがえのない財産となるだろう。

関連コンテンツ