【问题标题】:How to get information about subsequences from the array of numbers?如何从数字数组中获取有关子序列的信息?
【发布时间】:2015-06-22 19:50:06
【问题描述】:

我有一个数字数组(C#):

int[] seq = new[] { 2, 1, 4, 2, 1, 3, 
0, 0, 0, 0, 0, 
1, 5, 2, 3, 7, 
0, 0, 0, 
1, 2, 3, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

对于上面的序列,我需要这样的东西:

"Group1" - [0, 0, 0, 0, 0]
"Group2" - [0, 0, 0]
"Group3" - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

【问题讨论】:

  • 有哪些具体规则可以为您提供类似的东西?到目前为止,您所提供的不足以知道您真正想要什么。
  • 所以您希望将重复零的序列放入自己的数组中?

标签: c# arrays grouping subsequence


【解决方案1】:

这看起来像您将连续的零放入组中。我会将您的结果存储在Dictionary<string, List<int>> 中,您必须知道当您找到一个零时,您会创建一个新组,并且每个连续的零都将属于同一个组,直到序列被破坏。然后当找到下一个零时开始一个新组,依此类推。

类似:

int[] seq = new[] { 
    2, 1, 4, 2, 1, 3, 
    0, 0, 0, 0, 0, 
    1, 5, 2, 3, 7, 
    0, 0, 0, 
    1, 2, 3, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

bool newGroup = false;
Dictionary<string, List<int>> groups = new Dictionary<string, List<int>>();
foreach (int t in seq)
{
    if (t == 0)
    {
        if (!newGroup)
        {
            groups.Add(String.Format("Group{0}", groups.Count + 1), new List<int>());
            newGroup = true;
        }
        groups[groups.Keys.Last()].Add(t);
    }
    else
    {
        newGroup = false;
    }
}

groups.Keys.ToList().ForEach(k => Console.WriteLine("Key {0}: Value: {1}", k, String.Join(", ", groups[k])));

结果:

Key Group1: Value: 0, 0, 0, 0, 0
Key Group2: Value: 0, 0, 0
Key Group3: Value: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

【讨论】:

  • 感谢您的快速回复:)
【解决方案2】:

现在不能编译,但我猜……像这样应该可以工作......

var prev = seq[0];
var subseq = new List<int> { prev };

var retVal = new List<List<int>>();

for (var i = 1; i < seq.Length; i++)
{
    if (seq[i] == prev)
    {
        subseq.Add(seq[i]);
    }
    else
    {
        if (subseq.Count() > 1) 
        {
            retVal.Add(subseq);
        }

        subseq = new List<int>();
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2023-03-22
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多