プログラミング面接でよくあるタスクは(私の面接経験からではありませんが)、文字列または整数を取得して、すべての可能な順列をリストすることです。
これがどのように行われるか、また、このような問題を解決する背後にあるロジックの例はありますか?
いくつかのコードスニペットを見ましたが、コメントや説明が不十分で、理解するのが困難でした。
ベストアンサー1
まず第一に、匂いは再帰もちろん!
あなたも原理を知りたいと思うでしょうから、人間の言葉で説明できるように最善を尽くしました。再帰はほとんどの場合とても簡単だと思います。理解する必要があるのは 2 つのステップだけです。
- 最初のステップ
- その他のすべてのステップ(すべて同じロジック)
で人間の言語:
要するに:
- 1 つの要素の順列は 1 つの要素です。
- 要素セットの順列は、各要素が他の要素のすべての順列と連結されたリストです。
例:
セットに要素が 1 つだけある場合 -->
その要素を返します。
パーマ(a) -> aセットに 2 つの文字がある場合、その中の各要素について、残りの要素の順列を追加した要素を返します。次のようになります。
パーマ(ab) ->
a + パーマ(b) ->アブ
b + パーマ(a) ->バ
さらに、セット内の各文字について、セットの残りの文字の順列と連結した文字を返します。
パーマ(abc) ->
a + パーマ(bc) -->アブ、acb
b + パーマ(ac) -->バック、bca
c + パーム(ab) -->タクシー、CBA
パーマ(abc...z) -->
a + perm(...)、b + perm(....)
....
私は見つけた疑似コードの上http://www.programmersheaven.com/mb/Algorithms/369713/369713/permutation-algorithm-help/:
makePermutations(permutation) {
if (length permutation < required length) {
for (i = min digit to max digit) {
if (i not in permutation) {
makePermutations(permutation+i)
}
}
}
else {
add permutation to list
}
}
C#
さて、もう少し複雑なもの(そしてこれはc#のタグが付いているので)からhttp://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html: かなり長いですが、とにかくコピーすることにしたので、この投稿はオリジナルに依存しません。
この関数は文字列を受け取り、その文字列のあらゆる可能な順列を書き込みます。たとえば、「ABC」が指定された場合は、次のように出力されます。
ABC、ACB、BAC、BCA、CAB、CBA。
コード:
class Program
{
private static void Swap(ref char a, ref char b)
{
if (a == b) return;
var temp = a;
a = b;
b = temp;
}
public static void GetPer(char[] list)
{
int x = list.Length - 1;
GetPer(list, 0, x);
}
private static void GetPer(char[] list, int k, int m)
{
if (k == m)
{
Console.Write(list);
}
else
for (int i = k; i <= m; i++)
{
Swap(ref list[k], ref list[i]);
GetPer(list, k + 1, m);
Swap(ref list[k], ref list[i]);
}
}
static void Main()
{
string str = "sagiv";
char[] arr = str.ToCharArray();
GetPer(arr);
}
}