如果我有下一個數組:內部數組C#微調空間(除去0的)
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
我如何才能將所有不等於0離開,因爲他們可以讓陣列將建成類似的值這個:
int[] arr = { 123, 243, 123, 123, 0, 0, 0, 0, 0 };
謝謝!
如果我有下一個數組:內部數組C#微調空間(除去0的)
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
我如何才能將所有不等於0離開,因爲他們可以讓陣列將建成類似的值這個:
int[] arr = { 123, 243, 123, 123, 0, 0, 0, 0, 0 };
謝謝!
排序依據:
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 }.OrderBy(x => x == 0).ToArray();
另一個不錯的!布爾的順序是錯誤的,那麼這是真的,所以這個工作! +1 – 2012-02-07 15:31:42
如何使用LINQ:
var result = arr.Where(x => x != 0).Concat(arr.Where(x => x == 0)).ToArray();
這非常具有可讀性,具有線性時間複雜度。另一方面,它運行不正確,需要兩次輸入。
不錯,非常優雅! +1 – 2012-02-07 15:24:31
創建一個新數組並將值傳遞給它。
int[] newArr = new int[arr.Length];
int i = 0;
foreach (var v in arr)
{
if (v != 0)
{
newArr[i++] = v;
}
}
arr = newArr;
由於int
爲值類型的陣列與所有零初始化。然後,我們一次只複製一個值,如果值不爲0,則只增加目標索引i
。比所示的Linq示例更詳細,並且決定不冷卻。但如果你是一名學生,可能會更容易遵循。
試試這個:
arr.OrderBy(x=>x == 0).ToArray();
也許使用LINQ有:
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
arr = arr.OrderByDescending(a => a > 0).ToArray<int>();
所有的答案到目前爲止創建一個新的陣列。真的,你可以只在一個循環中移動項目,然後用0填充剩下的項目。
public static void ShiftZerosRight(this int[] arr)
{
int j = 0;
while (j < arr.Length && arr[j] != 0)
{
j++;
}
for (int i = j; i < arr.Length; i++)
{
if (arr[i] != 0)
{
arr[j++] = arr[i];
}
}
while (j < arr.Length)
{
arr[j++] = 0;
}
}
不優雅作爲單線LINQ表達式,但更有效 - 這不會產生任何新的對象(和LINQ創建幾個和最終新的數組),這是一個單次穿過所述陣列。作爲擴展方法的複雜性是沒有看到在主體其中它可以被用作:
int arr[] = { ... };
arr.ShiftZerosRight();
這段代碼不起作用。如果數組0有啓動arr [j]!= 0,這將在第一步失敗 – Peru 2017-02-17 01:12:23
此代碼段不會創建另一個array.Here「×[]」是您的陣列。您取第一個0值並將其替換爲非零數字。
int i=0,j=0,index=0,temp=0;
for(i=0;i<x.length;i++)
{
if(x[i]==0)
{
index=i;
for(j=index;j<x.length;j++)
{
if(x[j]!=0)
{
temp=x[j];
x[j]=x[i];
x[i]=temp;
break;
}
}
}
}
這功課嗎? – 2012-02-07 15:22:21
我會進行某種泡沫排序。如果這就是你所要求的,那麼沒有內建的呼叫。 – 2012-02-07 15:23:32