在C#中,用于压扁数组的最短代码是什么?
例如,我想要
[[1,2],[2,3],[4,5]]
进入数组
[1,2,3,4,5]
我正在寻找最短的方法。
答案 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)