你不指定如果有多個子序列順序會發生什麼,但我認爲只會有一個。
嘗試這種情況:
int length = 1;
int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 9 }; //0, 1, 2, 3, 4, 5, 6 are in sequence
//value prints 7
List<int> temp = arr.Zip(arr.Skip(1), (i1, i2) => length += (i2 - i1 == 1 ? 1 : 0)).ToList();
Length
將包含整數的序列中的數,其中ARR [N] == ARR [N + 1] - 1
乾杯
編輯:
如果存在多於一個的子序列,使得arr [n] == arr [n + 1] - 1,我們需要決定如何處理它。
一種方法是當我們發現不符合條件的值重置長度:
arr = new int[] { 0, 1, 2, 5, 4, 5, 6, 9 }; //Possible bug ?
length = 1;
temp = arr.Zip(arr.Skip(1), (i1, i2) =>
{
if(i2 - i1 == 1)
{
length++;
}
else
{
length = 1;
}
return i1;
}).ToList();
但隨後這將不考慮「最長」序列,它將返回的長度序列中的「最後」子序列。
在這種情況下,OP應該指定他想要的操作。
編輯#2:
如果我們想擁有最長的序列,那麼這可以用於:
arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 5, 4, 5, 6, 7, 9 }; //Possible bug ?
length = 1;
int longest = length;
temp = arr.Zip(arr.Skip(1), (i1, i2) =>
{
if (i2 - i1 == 1)
{
if (++length > longest)
longest = length;
}
else
{
length = 1;
}
return i1;
}).ToList();
緩存最長的有序序列的長度。然後使用longest
而不是length
作爲結果。
EDIT#3:
編輯#1 & 2現在應包含適當的解決方案。我當然試圖想出一個用戶評論的解決方案,但我沒有意識到我的VS解決方案中的當前代碼與我在此發佈的代碼不同。
需要指出的是,OP沒有這些額外的限制,而且我確實提到了我的解決方案沒有解決這些額外的限制。
儘管如此,它是解決;-)
乾杯
一個有趣的問題應該不是你的第二個例子輸出4而不是3? 1,2,3,4是順序的。 – gdir
好點,我應該校對。 –
你的實際_question_是什麼?你到目前爲止發佈的只是一個需求聲明。堆棧溢出不是代碼寫入服務。請提供[一個很好的,_minimal_,_complete_代碼示例](https://stackoverflow.com/help/mcve),它清楚地顯示了您嘗試過的內容,以及關於代碼的作用和不同之處的精確詳細解釋從你想要做的事情。 –