【问题标题】:Combination of a range of numbers consecutively一系列数字的连续组合
【发布时间】:2023-03-21 02:30:01
【问题描述】:

我想以连续的方式找到一系列数字的组合。 假设我有一个从 1 到 5 的数字范围,那么我的组合列表将类似于 {1} {2} {3} {4} {5} {1,2} {1,2,3} {1, 2,3,4} {1,2,3,4,5} {2,3} {2,3,4} {2,3,4,5} {3,4} {3,4,5} {4,5}。

但是,我的列表不应包含 {1,3,4,5} {1,5} {2,5} 等组合。它应该包含每组中连续的数字。

我已经通过在列表中添加一个左垫来尝试这个。在这种情况下,它也考虑了非连续集合。

        double count = Math.Pow(2, list.Count);
        for (int i = 1; i <= count - 1; i++)
        {
            string str = Convert.ToString(i, 2).PadLeft(list.Count, '0');

            for (int j = 0; j < str.Length; j++)
            {


                if (str[j] == '1')
                {
                    Console.Write(list[j]);

                }
            }
            Console.WriteLine();
        }

【问题讨论】:

  • 你的问题有道理,但不清楚你为什么突然开始填充字符串...

标签: c# numbers combinations


【解决方案1】:

这里有一个简单的方法:

for (int i = 0; i < range.Length; i++)
{
    for (int j = i+1; j <= range.Length; j++)
    {
        Console.WriteLine(string.Join(",", range[i..j]));
    }
}

如果您没有使用 C# 8(因此您不能使用范围),那么您可以使用 Skip()Take()

for (int i = 0; i < range.Length; i++)
{
    for (int j = i+1; j <= range.Length; j++)
    {
        Console.WriteLine(string.Join(",", range.Skip(i).Take(j-i)));
    }
}

请注意,这会打印 {1}、{1,2}、{1,2,3}、{1,2,3,4}、{1,2,3,4,5}、{2}等而不是 {1}、{2}、{3}、{4}、{5}、{1,2} 等。如果这很重要,您可以像这样调整它:

foreach (var item in range)
{
    Console.WriteLine(item);    
}

for (int i = 0; i < range.Length; i++)
{
    for (int j = i+2; j <= range.Length; j++)
    {
        Console.WriteLine(string.Join(",", range.Skip(i).Take(j-i)));
    }
}

【讨论】:

  • 是的,它会 - 随着输入数量的增加,组合的数量会增加很多!
  • 如果这个答案对你有帮助,请考虑接受/支持它
  • 但是,这些集合是重复的。例如,如果集合是从 1 到 3,那么输出是 1 1 1,2 1,2 1,2,3 1,2,3 2 2 2,3 2,3 3 3 无论如何,谢谢。跨度>
  • @user3812657 这不是真的吗?见这里:dotnetfiddle.net/AGitca
  • 我的错,你是对的。我在 for 循环中尝试使用列表和数组。对此感到抱歉。
猜你喜欢
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多