我正在尝试将负数向左移动。
using System;
class Class1
{
static void rearrange(int[] arr, int n)
{
int j = 0, temp;
for (int i = 0; i < n; i++)
{
if (arr[i] < 0)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j++;
}
}
}
static void printArray(int[] arr, int n)
{
for (int i = 0; i < n; i++)
Console.Write(arr[i] + ",");
}
//Call the Method
public static void Main()
{
int[] arr = { 1, -4, -7, 4, -2, 6, -9 };
int n = arr.Length;
rearrange(arr, n);
printArray(arr, n);
}
}
该问题需要输出{-4,-7,-2,-9,1,4,6} 但是我的输出是{-4,-7,-2,-9,1,6,4},因为代码是用4切换-9。 如何调整密码?
答案 0 :(得分:0)
使用LINQ会更简单吗? 这是使用LINQ完成您需要的代码:
myUserObject.getProperty("myColumnName");
输出:
var list = new[]{ 1, -4, -7, 4, -2, 6, -9 };
var newList = list.Where(x => x < 0).Union(list.Where(x => x >= 0)).ToList();
Console.WriteLine(string.Join(", ", newList));
答案 1 :(得分:0)
问题似乎出在代码始终将负数与应该位于负数的位置的数字交换。当连续有几个正数时,这将成为一个问题,因为当低索引中的正数与高索引中的负数交换时,顺序会受到干扰。当i
为4
且-2
与1
交换时会发生这种情况(因此,此时数组看起来像{ -4, -7, -2, 4, 1, 6, -9 }
);再一次,当i
为6
并且-9
被4
交换时,结果提示您的问题将留给您。
要解决此问题,您必须在内部循环中将负数与它前面的数字交换,直到它前面的数字也为负,以便数字保持其相对位置:
static void Rearrange(int[] arr)
{
// Start at index 1 since the first item can't move left
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] < 0)
{
// Walk backwards from the current index, swapping items as we
// go, until the item in the previous index is also negative
for (int j = i; j > 0; j--)
{
// If previous item is negative, we can stop
if (arr[j - 1] < 0) break;
// Otherwise, swap this item with the previous item
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}
答案 2 :(得分:-1)
在最后一次迭代之前,数组处于此状态:
{-4,-7,-2,4,1,6,-9}
您的算法然后将-9和4交换:
{-4,-7,-2, -9 ,1、6, 4 }
为什么要期望6是数组中的最后一个数字?
如果您希望对数字进行排序,C#提供了一种.OrderBy
扩展方法,但这也将更改负数的顺序。