这个问题还是稍有难度的。
public List<string> GetPattern(string str) { if (string.IsNullOrEmpty(str)) return null; else if (str.Length == 1) return new List<string> { str }; var result = new List<string>(); var current = str[0]; var sbChildren = GetPattern(str.Substring(1)); foreach (var child in sbChildren) { for (var i = 0; i <= child.Length; i++) result.Add(child.Insert(i, current.ToString())); } return result; }
即兴写了一个,试了下,可以得到效果,但性能和效率你自己得优化下。这里没考虑你给AAC这种包含重复字符的情况。而且如果递归嵌套层数过多CLR也会报错。内存优化也没有做,我试了一个长点的,报内存举出,估计是返回的数据量过大导致、
这是Google还是Baidu的面试题,需要巧妙的解题思路,高级算法、还是只要有答案就行?
如果只要能得出答案,就很容易,如果需要高大上的答案,请明说...
这是我上一家公司的笔试题,是个小公司,原题是:用程序实现"XYZ"的所有组合?这个倒是简单,我在这个题的基础上进行了扩展。只要写代码能实现就行。
@xiaoafei1991:
这样就简单了,你先考虑下数量是多少,应该是
n*(n-1)*(n-2)...*1
拆解为代码的思路如下
1、第一位有N种可能
2、后面就是递归了,变成求解N-1的变化
代码你自己考虑下,OK?
高数上有排列和组合的概念 你可以参考下
难。这个题在实际中有意义吗?工作N年,你遇到了吗?
感觉和图论,图的遍历有关系
1 static void Main(string[] args) 2 { 3 Console.WriteLine("请输入字符串:"); 4 string str = Console.ReadLine(); 5 List<string> list= GetGroups(str); 6 Console.WriteLine("结果:"); 7 list.ForEach(s=>Console.Write(s+"\t")); 8 Console.ReadKey(); 9 } 10 11 #region 1.0 返回所有字符串组合集合 List<string> GetGroups(string str) 12 /// <summary> 13 /// 返回所有字符串组合集合 14 /// </summary> 15 /// <param name="str">需要组合的字符串</param> 16 /// <returns></returns> 17 static List<string> GetGroups(string str) 18 { 19 //创建随机函数 20 Random rdom = new Random(); 21 //创建字符串变量用来接收的产生的组合的每一种可能 22 string re = ""; 23 //使用函数,递归求出有多少组合可能 24 int count = GetNum(str.Length); 25 //创建集合 26 List<string> list = new List<string>(count); 27 // 如果集合中的个数小于可能组合的个数,则继续循环 28 while (list.Count < count) 29 { 30 //产生输入字符串个数的随机数 31 int index = rdom.Next(0, str.Length); 32 // 判断字符串变量中是否包含产生的字母,如果不包含则拼接到字符串上 33 if (!re.Contains(str[index])) 34 { 35 re += str[index]; 36 } 37 // 判断拼接字符串的长度有没有达到输入字符串的长度 38 if (re.Length == str.Length) 39 { 40 //判断集合中有没有包含该字符串,如果没有,加入集合 41 if (!list.Contains(re)) 42 { 43 list.Add(re); 44 } 45 //清空字符串 46 re = ""; 47 } 48 } 49 return list; 50 } 51 #endregion 52 53 #region 2.0 求出输入数值的阶乘 int GetNum(int num1) 54 /// <summary> 55 /// 求出输入数值的阶乘 56 /// </summary> 57 /// <param name="num1"></param> 58 /// <returns></returns> 59 static int GetNum(int num1) 60 { 61 if (num1 <= 1) 62 { 63 return 1; 64 } 65 else 66 { 67 return num1 * GetNum(num1 - 1); 68 } 69 } 70 #endregion
随机数都用了上,随机数在这儿起什么作用?没看懂,看着也没有我上面的简洁啊
这是全排列的问题。
void swap(elemType* list,int i,int j){ int temp=list[i]; list[i]=list[j]; list[j]=temp; } void perm(elemType* list,int k,int m){ if (k==m){ for (int i=0;i<m;i++){ cout<<list[i]<<" "; } count++; cout<<endl; } for(int j=k;j<m;j++){ swap(list,k,j); perm(list,k+1,m); swap(list,j,k); } }