在C#中展平数组

时间:2016-04-09 03:42:23

标签: c# arrays flatten

在C#中,用于压扁数组的最短代码是什么?

例如,我想要

[[1,2],[2,3],[4,5]]

进入数组

[1,2,3,4,5]

我正在寻找最短的方法。

1 个答案:

答案 0 :(得分:6)

将交错数组转换为1维数组很简单,可以在O(n)时间和n空间中完成(其中n是第二维数组长度的总和)但是在你的例子中,你似乎删除了重复的值 - 这不会使数组变平,但它仍然可以在O(n)时间内完成,但需要O(2n)空间,因为你需要{{1的哈希表重复值查找。

预先知道最终数组中将存在多少元素可能存在问题。一个简单的解决方案是在O(1)附加List<T>并在最后调用.ToArray(),但这会产生O(2n)时间和O(3n)空间(但可能更多是由于{{ 1}}内部重新分配):

List<T>

另一种解决方案是通过自己做2次传递:第一次确定输出的大小,然后是第二次传递来生成它 - 这将导致更少的复制:完全Int32[][] jagged = ... HashSet<Int32> seen = new HashSet<Int32>(); List<Int32> ret = new List<Int32>(); for(int i = 0; i < jagged.Length; i++) { for(int j = 0; j < jagged[i].Length; j++) { Int32 val = jagged[i][j]; if( !seen.Contains( val ) ) { ret.Add( val ); seen.Add( val ); } } } return ret.ToArray(); // This takes O(n) time and will allocate O(n) additional space. 时间和完全{{1} } space:

O(2n)