C++テンプレートライブラリでstd::list(双方向チェーンテーブル)兼ジョセフリング問題
2846 ワード
毒鶏スープ:My moto is:Contented with little,yet wishing for more.私の座右の銘は:少し満足していますが、もっと多くのことを望んでいます.
建国記念日に見る《剣の指offer》を始めて、最後のいくつの題がまだあります
========================================================================================
ジョセフ問題は有名な問題です.N人が囲まれていて、最初から数え始め、M番目は殺され、最後に残り、残りは殺されます.例えばN=6,M=5,殺される順番は5,4,6,2,3,1である.
サークルなので、その中からデータを削除するので、まず思いついたのはループチェーンで解決することです.最近は学校C++なので、テンプレートライブラリの双方向チェーンで直接使いました.
Listsは要素をチェーンテーブルに順次格納.ベクトル(vectors)に比べて、迅速な挿入と削除を可能にするが、ランダムアクセスは遅い.
建国記念日に見る《剣の指offer》を始めて、最後のいくつの題がまだあります
========================================================================================
ジョセフ問題は有名な問題です.N人が囲まれていて、最初から数え始め、M番目は殺され、最後に残り、残りは殺されます.例えばN=6,M=5,殺される順番は5,4,6,2,3,1である.
サークルなので、その中からデータを削除するので、まず思いついたのはループチェーンで解決することです.最近は学校C++なので、テンプレートライブラリの双方向チェーンで直接使いました.
int LastRemaining_Solution1(unsigned int n, unsigned int m)
{
if(n < 1 || m < 1)
return -1;
unsigned int i = 0;
list numbers;
for(i = 0; i < n; ++ i)
numbers.push_back(i);
list::iterator current = numbers.begin();
while(numbers.size() > 1)
{
for(int i = 1; i < m; ++ i)
{
current ++;
if(current == numbers.end())
current = numbers.begin();
}
list::iterator next = ++ current;
if(next == numbers.end())
next = numbers.begin();
-- current;
numbers.erase(current);
current = next;
}
return *(current);
}
C++に詳しくないので、このコードを見たとき、疑問に思ったのですが、次はなぜですか.if(current == numbers.end())
current = numbers.begin();
if(next == numbers.end())
next = numbers.begin();
を探してみたらbeginがチェーンテーブルの最初の要素を指していることがわかりましたが、endはチェーンテーブルの最後の要素ではなく、最後の要素の後を指しているので、上のコードがあります.そうすれば、ループチェーンテーブルを構成することができます.次はlistのメンバー関数の役割です.一緒に勉強しましょう(ジョセフ問題については、剣指offerの中にもっと効率的な方法が提案されています.興味のある人は探してみてください.削除された数字の法則を探して、説明するのが面倒です.)Listsは要素をチェーンテーブルに順次格納.ベクトル(vectors)に比べて、迅速な挿入と削除を可能にするが、ランダムアクセスは遅い.
STL end() , , 。
assign() list
back()
begin()
clear()
empty() list true
end() ( 。)
erase()
front()
get_allocator() list
insert() list
max_size() list
merge() list
pop_back()
pop_front()
push_back() list
push_front() list
rbegin()
remove() list
remove_if()
rend() list
resize() list
reverse() list
size() list
sort() list
splice() list
swap() list
unique() list