這是我所擁有的,但我不知道為什么會出錯:
public static int findMedian(List<int> arr)
{
int[] asArray = arr.ToArray();
int[] arrSorted = Array.Sort(asArray);
float midIndex = 0;
int arrLength = arrSorted.Length;
if (arrLength % 2 == 1)
{
midIndex = Math.Ceiling(arrLength / 2);
return arrSorted[midIndex];
}
else
{
return (arrSorted[Math.Ceiling(arrLength / 2)] arrSorted[Math.Floor(arrLength / 2)]) / 2;
}
}
它說“無法將型別 'void' 隱式轉換為 'int[]' ”,但我不知道 'void' 來自哪里。
uj5u.com熱心網友回復:
如前所述,該Array.Sort方法對現有陣列進行排序,并且不回傳新陣列。這很容易通過使用回傳一個新方法的方法來解決。
接下來,無需使用Math.Ceiling- 這導致您使用float. 你可以只使用整數數學。
試試這個解決方案:
public static int FindMedian(List<int> source)
{
int[] sorted = source.OrderBy(x => x).ToArray();
return (sorted[(sorted.Length - 1) / 2] sorted[sorted.Length / 2]) / 2;
}
當源具有奇數個元素時,此代碼執行冗余加法和除法,因此您可以改用它,盡管結果是相同的:
public static int FindMedian(List<int> source)
{
int[] sorted = source.OrderBy(x => x).ToArray();
int i = (sorted.Length - 1) / 2;
int j = sorted.Length / 2;
return i == j ? sorted[i] : (sorted[i] sorted[j]) / 2;
}
或者,一個更明確的方法:
public static int FindMedian(List<int> source)
{
int[] sorted = source.OrderBy(x => x).ToArray();
if (sorted.Length % 2 == 1)
{
return sorted[sorted.Length / 2];
}
else
{
return (sorted[sorted.Length / 2] sorted[sorted.Length / 2 - 1]) / 2;
}
}
對于所有這三種方法,我可以使用以下資料進行測驗:
var samples = new int[][]
{
new int[] { 10 },
new int[] { 10, 20 },
new int[] { 10, 20, 30 },
new int[] { 10, 20, 30, 40 },
};
我分別得到10, 15, 20, 25每條線的中位數。
uj5u.com熱心網友回復:
錯誤來自您的int[] arrSorted = Array.Sort(asArray);行,Array.Sort()對傳入其第一個引數的陣列進行排序,不回傳任何內容。因此,將行更改為 justArray.Sort(asArray);應該可以解決它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/360819.html
標籤:C#
