【问题标题】:list produces specific set of combinationslist 产生特定的组合
【发布时间】:2013-03-07 06:32:49
【问题描述】:

我有一个 C# 列表:

  1. 一个
  2. 一个
  3. C
  4. D
  5. 一个

我怎样才能找到下一个字母的索引总是更大的所有字母组合。因此,在这种情况下,组合可能是:A、AB、ABA、C、CD、ADA...但不是 DC、CB...,因为对于上一个示例,B 索引位于 C 索引之前。使用索引,1、12、123、146、134 会被接受,但像 143 这样的东西不会被接受,因为 4 大于 3。

【问题讨论】:

  • 我认为这是因为列表中有 3 个As,所以ABA123(或126)和ADA156(参见索引上面列出的)
  • 列表长度有限制吗?每个排列的长度是否有限制?如果您已经尝试过,请发布您的代码。

标签: c# math permutation indexing


【解决方案1】:

只需生成集合{1,2,3,4,5,6} 的所有非空子集。对于每个这样的子集,只需取其数字(按递增顺序)并将它们转换为相应的字母。这样,您将获得所有可能的字母序列。然后,如有必要,您必须删除重复项 - 例如,A 将由集合 {1}{3}{6} 生成三次。

【讨论】:

    【解决方案2】:

    此代码生成所有组合(作为列表的序列):

        static void Main(string[] args)
        {
            GetCombination(new List<char> { 'A','B','C' });
            Console.ReadKey();
        }
        static void GetCombination(List<char> list)
        {
            for (int i = 1; i < Convert.ToInt32(Math.Pow(2, list.Count)); i++)
            {
                int temp = i;
                string str = "";
                int j = Convert.ToInt32( Math.Pow(2, list.Count - 1));
                int index = 0;
                while (j > 0)
                {
                    if (temp - j >= 0)
                    {
                        str += list[index];
                        temp -= j;
                    }
                    j /= 2;
                    index++;
                }
                Console.WriteLine(str);
            }
        }
    

    输出是:

    C
    B    
    BC
    A
    AC
    AB
    ABC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多