编写采访编程的一项常见任务(尽管不是我的采访经验)是获取一个字符串或整数,并列出所有可能的排列。
是否有一个示例说明如何完成此操作以及解决此类问题的逻辑背后?
我已经看到了一些代码片段,但是它们没有得到很好的注释/解释,因此很难遵循。
首先:当然,它闻起来像 递归 !
由于您也想了解该原理,因此我尽力用人类语言来解释它。我认为大多数时候递归都很容易。您只需要掌握两个步骤:
用 人类语言 :
简而言之: 1. 1个元素的排列是一个元素。 2.一组元素的排列是每个元素的列表,并与其他元素的每个排列连接在一起。 例: 如果集合只有一个元素-> 返回它。 烫发(a)- > a 如果集合有两个字符:对于其中的每个元素:返回该元素,并添加其余元素的排列,如下所示: 烫发(ab)- > a +烫发(b)-> ab b +烫发(a)-> ba 进一步:对于集合中的每个字符:返回一个字符,该字符与一组>其余集合相结合 烫发(abc)-> a +烫发(bc)-> abc , acb b +烫发(ac)-> bac , bca c +烫发(ab)-> cab , cba 烫发(abc … z)-> a +烫发(…),b +烫发(....) ....
简而言之: 1. 1个元素的排列是一个元素。 2.一组元素的排列是每个元素的列表,并与其他元素的每个排列连接在一起。
例:
如果集合只有一个元素-> 返回它。 烫发(a)- > a
如果集合有两个字符:对于其中的每个元素:返回该元素,并添加其余元素的排列,如下所示:
烫发(ab)- >
a +烫发(b)-> ab
b +烫发(a)-> ba
进一步:对于集合中的每个字符:返回一个字符,该字符与一组>其余集合相结合
烫发(abc)->
a +烫发(bc)-> abc , acb
b +烫发(ac)-> bac , bca
c +烫发(ab)-> cab , cba
烫发(abc … z)->
a +烫发(…),b +烫发(....) ....
我在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#
好的,从http://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html进行更详尽的介绍(由于它被标记为c#):相当冗长,但是我决定复制它无论如何,因此帖子不依赖原始帖子。
该函数接收一个字符串,并记下该精确字符串的所有可能排列,因此,例如,如果提供了“ 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); } }