2015-10-18 93 views
-3

我想查找數組中有多少個值沒有排序就按順序排列。數組中有多少個值按順序排列

對於實例,如果我有。

int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 9 } //0, 1, 2, 3, 4, 5, 6 are in sequence 
int value = HighestSequence(arr); 
//value prints 7 

int[] arr = new int[] { 0, 4, 1, 2, 3, 4, 7, 9 } //1, 2, 3, 4 are in sequence 
int value = HighestSequence(arr); 
//value prints 4 

int[] arr = new int[] { 0, 1, 2 } //0, 1, 2 is in sequence 
int value = HighestSequence(arr); 
//value prints 3 
+1

一個有趣的問題應該不是你的第二個例子輸出4而不是3? 1,2,3,4是順序的。 – gdir

+0

好點,我應該校對。 –

+1

你的實際_question_是什麼?你到目前爲止發佈的只是一個需求聲明。堆棧溢出不是代碼寫入服務。請提供[一個很好的,_minimal_,_complete_代碼示例](https://stackoverflow.com/help/mcve),它清楚地顯示了您嘗試過的內容,以及關於代碼的作用和不同之處的精確詳細解釋從你想要做的事情。 –

回答

-2

試試看。我得到了(7,4,3)的結果。雖然彼得對StackOverflow是正確的,但你應該試圖說出你的問題,而不是要求回答。我只提供它,因爲它是一個很好的挑戰。

var set1 = new [] { 0, 1, 2, 3, 4, 5, 6, 9 }; 
var result1 = HighestSequence(set1); 

var set2 = new[] { 0, 4, 1, 2, 3, 4, 7, 9 }; 
var result2 = HighestSequence(set2); 

var set3 = new [] { 0, 1, 2 }; 
var result3 = HighestSequence(set3); 

public int HighestSequence(int[] values) 
{ 
    IList<int> sequenceCounts = new List<int>(); 

    var currentSequence = 0; 
    for (var i = 0; i < values.Length; i++) 
    { 
     if (i == (values.Length - 1)) //End edge case 
     { 
      if (values[i] - values[i - 1] == 1) 
      { 
       currentSequence++; 
       sequenceCounts.Add(currentSequence); 
      } 
     } 
     else if ((values[i] + 1) == values[i + 1]) 
     { 
      currentSequence++; 
     } 
     else 
     { 
      currentSequence++; 
      sequenceCounts.Add(currentSequence); 
      currentSequence = 0; 
      continue; 
     } 
     sequenceCounts.Add(currentSequence); 
    } 
    return sequenceCounts.Max(); 
} 
+0

@AlexMoreno,出於好奇,是什麼讓你選擇這個解決方案在我的?是因爲我在使用Linq嗎? –

+0

,因爲你沒有使用linq。評論是正確的我應該增加我的版本,並且它的一個例子,但它當時沒有發生在我身上。 Linq不適用於3.0以前的.NET版本,我只是不記得如何去做而不使用它。 –

2

你不指定如果有多個子序列順序會發生什麼,但我認爲只會有一個。

嘗試這種情況:

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沒有這些額外的限制,而且我確實提到了我的解決方案沒有解決這些額外的限制。

儘管如此,它是解決;-)

乾杯

+0

你測試了你的解決方案嗎?我的意思不僅是單調序列 –

+0

我對OP提供的數據集測試了我的解決方案,該數據集包含一個非單調序列(值的第二個數組)。你爲什麼問,你有沒有發現問題? –

+0

是的,我在問,因爲我喜歡你的解決方案,因爲它很簡潔,想要投票,但運行它並看到它不工作:(試試'{0,1,2,5,4,5,6,9}看到'5',可惜 –