プログラミングの質問:
文字列内の単語を逆にします(単語は1つ以上のスペースで区切られます)。 今すぐインプレースで。
上記のコンテキストでPHPまたはJavaScript)のような「インプレース」とはどういう意味ですか?
これは、使用している言語の低レベルに依存しますが、Cのようなものを想定すると、それは"文字列を分解して、メモリの別の部分に戻さないでください。文字列は既にメモリにあります)。
つまりない:
1. foo bar baz
2. foo bar baz -> baz
3. foo bar baz -> baz bar
4. foo bar baz -> baz bar foo
だが:
1. foo bar baz
2. baz foo bar
3. baz bar foo
(または正確にあなたのアルゴリズムは動作します。)
通常は、追加のメモリを使用せずに操作を実行することを意味します。空間の複雑さに関して、補助的な空間の複雑さはO(1)になります。
実際には、実装によっては、一時変数が許可される場合があります。この場合、出力はメモリ内の入力と同じ場所を使用する必要があります。
このコンテキストでは、追加のメモリを使用するのではなく、元の変数を変更することを指します。これは、元の文字列を実行して各文字を新しい文字列変数にコピーするのではなく、元の文字列を表示しているときに部分を交換する必要があることを意味します。
Wikipediaには実際、トピックに関する 記事全体 があり、メモリ使用量の最小化に関するトピックの関連性と有用性を引用しています。
インプレースはこのようなものになります:
void reverse(char *str)
{
if(!str)return;
reverse(strtok(NULL," "));
printf("%s ",revStr);
}
「インプレースアルゴリズム(またはその場でのラテン語)は、少量の一定の追加ストレージスペースを持つデータ構造を使用して入力を変換するアルゴリズムです。通常、入力は、アルゴリズムの実行時に出力によって上書きされます。」
出典:インプレースアルゴリズム