[解決済み] 文字列/整数のすべての並べ換えをリストアップします。
質問
プログラミングの面接でよくある課題(私の面接の経験ではありませんが)は、文字列や整数を取り出して、可能な限りの順列を並べることです。
このような問題をどのように行い、どのような論理で解くのか、例はありますか?
コードスニペットをいくつか見ましたが、コメントや説明が十分でなかったため、フォローしにくいです。
どのように解決するのですか?
まず第一に、以下のような臭いがします。 再帰 勿論
原理も知りたいということでしたので、頑張って人語で説明しました。再帰は、たいていの場合、とても簡単だと思います。2つのステップを把握すればいいだけですから。
- 最初のステップ
- 他のすべてのステップ(すべて同じロジックです)
で 人間語 :
要するに
- 1要素の順列は1要素である。
- 要素の集合の順列は、各要素を他の要素の順列と結合したリストである。
例
セットが1つの要素だけである場合 -->
を返します。
perm(a) -> aセットが2つの文字を持つ場合: for の各要素を返します。 要素の並べ換えを のように、残りの要素を追加します。
perm(ab) ->
a + perm(b) -> ab
b + perm(a) -> バ
さらに:集合の各文字について:文字と > の並べ換えを連結したものを返す。
perm(abc) ->
a + perm(bc) --> abc , アクブ
b + perm(ac) --> バック , ビーシーエー
c + perm(ab) --> キャブ , キャバ
perm(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#
OK、そしてもっと凝ったものを(そして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);
}
}
関連
-
[解決済み】C#で四捨五入する方法
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#のマルチライン文字列リテラル
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み] 32ビット整数のセットビットの数を数えるには?
-
[解決済み] リストのすべての並べ換えを生成するには?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】与えられた文字列のすべての並べ換えを生成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】WebResource.axdとは何ですか?