本文の内容は、私が C++ を使用してさまざまな LeetCode の問題を解決する際に得た有益な情報と経験に基づいて書かれています。
P.S. おそらく、逆天的なアルゴリズムの解決策ではなく、C++ の使用に重点を置いています。
map#
一般的に、map は非常に便利なものであり、set で解決できる問題でも、私は依然として map を使用して解決することがあり、とても快適に感じます。
作成#
作成する際には、mapまたはunordered_map<type, type> variable_name
という形式で型を指定する必要があります。作成されたものは空です。例として、unordered_map<string, int> maps
を挙げます。
挿入と削除#
カウントアプリケーション(問題を解くためによく使用する)の場合、つまり後の型が int の場合、使用は非常に簡単で、単にmaps["hello"]++
とするだけで、対応するキー値が作成されて + 1 されます。ここで注意すべき点は、キーに対応する値が 0 に減少した場合でも、そのキーが消えるわけではなく、maps.erase("hello")
を使用して対応するキーを完全に削除する必要があるということです。
その他のアプリケーションでは、maps.insert(pair<string, string>("hello", "world"))
を使用する必要があります。
検索#
ハッシュテーブルとして、検索はその根本的な理由です。
特定のキーがテーブルに存在するかどうかを確認するには、if(maps.find("hello")!=maps.end())
とします。返り値が true の場合、テーブルに存在することを意味します。ここでの返り値はイテレータであり、イテレータの使用方法は次のようになります。maps.find("hello")->first
はキーの値(つまり "hello")であり、maps.find("hello")->second
は "hello" に対応する値です。
map を反復処理するには、イテレータが必要です。unordered_map<string, int>::iterator itr
を作成し、その後、通常の反復処理とほぼ同じ方法で for ループを使用します。for(itr=maps.begin();itr!=maps.end();itr++)
のようにして反復処理できます。
string#
string のさまざまな操作方法は非常に多様であり、ほとんど同等に感じるものが多いです。
assign#
基本的な使い方はs1.assign(s, index, num)
であり、これにより、s 文字列の index インデックス以降の num 個の文字が s1 文字列に割り当てられます。
基本的には substr と同じです。
substr#
s1=s.substr(index, num)
という操作は、assign を使用する場合と同等です。
for#
以前は自動的な反復処理のトリックを使用したことがありませんでした。
例えば、for(auto i:nums)
またはfor(auto &i:maps)
のように使用します。後者では、値を取得するためにt.first
とt.second
を使用します。また、for(auto &[key,value]:maps)
を使用すると、直接キーと値を取得できます。
reverse#
これは、C++ でサポートされているさまざまなデータ構造を反転するために使用できるようです。通常、2 つの入力パラメータがあり、使用方法は次のようになります。reverse (開始位置、開始位置 + 反転する要素の数) です。この観点から見ると、入力パラメータは左閉右開の範囲です。例えば、reverse(string.begin(), string.end())
...
まあ、最初に使用すると少し混乱しますが、C++ の多くの標準関数が同様の入力形式を採用している可能性が非常に高いため、注意が必要です。
resize#
文字列にとっては非常に便利で、単に resize (更新後のサイズ) とするだけで、文字列を指定した長さまで拡張できます。余分な部分は空のままです。
sort#
sort(begin(), end())
のように使用します。基本的には、光速で昇順にソートできます。ここでの開始と終了は、reverse と同じです。先ほどの推測が正しかったことを示しています😄。
おそらく、カスタム関数を第三の入力パラメータとして使用して、ソートの基準とすることもできるようですが、それについては問題に直面したときに書きます。未使用のものは一切書きません😋。