-1

假设我有以下二维数组:

{{0,1,2,3,4}, {6,7,8,9}, {5,6}, {10}}

如何找到重叠的索引?(注意 6 个重叠)并根据 x 标准删除一个?

输出应该是

{{0,1,2,3,4}, {6,7,8,9}, {10}, {5}}

或者

{{0,1,2,3,4}, {7,8,9}, {5,6}, {10}}

基于 x。x 是一个 int 值。0 应该输出不变,1 应该输出顶部,2 应该输出底部。

我 100% 确定所有子数组都是从 n 到 k 递增 1 的序列。

4

2 回答 2

1

只需跟踪到目前为止您在集合中使用的所有项目,然后对于每个新的内部数组,您可以只生成除已使用的项目之外的所有项目:

public static IEnumerable<IEnumerable<int>> Foo(int[][] data)
{
    var items = new HashSet<int>();
    foreach (var array in data)
    {
        yield return array.Except(items);
        items.UnionWith(array);
    }
}
于 2013-06-21T18:36:32.207 回答
0

非 C# 特定的答案:

  • 按数组的最小值对数组进行排序
  • 遍历数组
    • 如果当前数组的最大元素小于下一个数组的最小元素,我们没有重叠,所以什么都不做
    • 如果要从当前数组中删除元素,请从等于下一个数组的最小值的元素中删除。
    • 如果要从下一个数组中删除元素,请截取等于当前数组最大值的元素。

由于这些是数组并且顺序元素加一,我们可以通过做一个简单的减法来确定剪切索引,我们不需要遍历数组。

这将删除数组的顺序,但从示例中看,这似乎并不重要。
如果很重要,保留每个数组的原始索引并不难。

如果一个数组可以与多个其他数组重叠(在同一侧),可能会有一些额外的复杂性,但处理起来应该不会太难。

例子:

Input: {{0,1,2,3,4}, {6,7,8,9}, {5,6,7}, {10}}  
Sorted: {{0,1,2,3,4}, {5,6,7}, {6,7,8,9}, {10}}

Arrays 1 and 2:  
4 < 5, no overlap

Arrays 2 and 3:  
7 >= 6, overlap  
Either cut off 6 and 7 from array 2, or 6 and 7 from array 3  
(depending on what output you want)

Arrays 3 and 4:
9 < 10, no overlap

Output:  
{{0,1,2,3,4}, {5}, {6,7,8,9}, {10}}  
or  
{{0,1,2,3,4}, {5,6,7}, {8,9}, {10}}
于 2013-06-25T12:35:22.557 回答