【发布时间】:2017-02-16 13:01:43
【问题描述】:
问题
编写一个程序对任何给定的正负数整数数组进行排序,使得正数跟随负数,但是正数和负数的相对位置保持不变。就像下面的示例 (1) 一样,(-7) 出现在 (-5) 之后,因此在排序数组中 (-7) 出现在 (-5) 之后。
程序应该只迭代给定数组一次,并且不应该使用临时数组。
示例 1。 给定数组:{ 2, 4, -5, 0, -7, -2, 2, -5, 1, -9, -7, -1 }
排序数组:{ -5, -7, -2, -5, -9, -7, -1, 2, 4, 0, 2, 1 }
示例 2。 给定数组:{ -3, 7, 0, -2, -1, 3, -3, 9, 5, -5, 8}
排序数组:{ -3, -2, -1, -3, -5, 7, 0, 3, 9, 5 , 8}
我的解决方案
class Program
{
public static void Main(string[] args)
{
var intArray = new int[] { 2, 4, -5, 0, -7, -2, 2, -5, 1, -9, -7, -1 };
var sorted_intArray = SortIntArray(intArray);
Console.WriteLine(String.Join(",", sorted_intArray));
intArray = new int[] { -3, -2, -1, -3, -5, 7, 0, 3, 9, 5, 8 };
sorted_intArray = SortIntArray(intArray);
Console.WriteLine(String.Join(",", sorted_intArray));
Console.ReadLine();
}
private static int[] SortIntArray(int[] intArray)
{
var sorted_intArray = intArray.GroupBy(_int => _int < 0 ? -1 : 1)// Create group of +ve and -ve numbers
.OrderBy(group => group.Key) // Bring group of -ve number first
.SelectMany(groupedItems => groupedItems).ToArray(); // Select num from both Group and convert to array
return sorted_intArray;
}
}
问题
i) 问题陈述说,数字应该只迭代一次,并且不应该使用临时数组。我相信我使用 linq 的解决方案不符合这个要求。如果可能的话,如何用 linq 解决上述问题?
ii) 在使用或不使用 linq 的情况下,解决上述问题的其他可能且有效的方法是什么?使用 C/C++ 的解决方案也很好。
【问题讨论】:
-
有一个可能的解决方案是在扩展方法中创建一个临时数据结构。我看不出没有临时工怎么解决。存储给定您想要(输入?)数字的正整数的数据结构迭代一次,对吧?这样输出数字可以迭代一次
-
看起来像 this question 的副本
-
您实际上并没有多次迭代数组。你只迭代一次。