2013-08-14 24 views
8

Giả sử một mảng là tuần tự khi mỗi phần tử thành công có giá trị của phần tử trước + 1. Giả sử tôi có một dãy số như {5,6,7,8} (tuần tự) hoặc {1,2,5} (không tuần tự).Cách chức năng để kiểm tra xem dãy số là tuần tự

Có cách nào tốt đẹp để kiểm tra xem mảng có tuần tự không? Tôi có thể làm điều đó với mã sau:

bool IsSequential(int[] array) 
{ 
    for (int i = 1; i < array.Length; i++) 
     if (array[i] != array[i - 1] + 1) 
      return false; 
    return true; 
} 

Tôi đang cố gắng xác định xem một tay bài poker có thẳng không.

+0

bản sao có thể có của [đảm bảo mảng là tuần tự trong C#] (http://stackoverflow.com/questions/5413272/make-sure-array-is-sequential-in-c-sharp) – Gabe

+0

Làm cách nào để bạn xử lý các ACE? Nếu giá trị của nó là 1, bạn không thể sử dụng phương pháp này để phát hiện một ace-cao thẳng. – Gabe

+2

Mã của bạn rất đơn giản và hoạt động hoàn hảo –

Trả lời

8

Hãy thử điều này một:

bool IsSequential(int[] array) 
    { 
     return array.Zip(array.Skip(1), (a, b) => (a + 1) == b).All(x => x); 
    } 
+1

Điều này yêu cầu LINQ. – Gabe

+0

@AlexeiLevenkov: Nếu bạn không sử dụng 'Bỏ qua', bạn chỉ so sánh các phần tử với chính mình, tất nhiên sẽ luôn bằng nhau. – Gabe

2

Tôi không biết nếu nó thực sự là một cải tiến/đẹp hơn nhưng bạn có thể sử dụng Range.

ENumerable.Range(0, myArray.Length).Any(i => myArray[i] != myArray[0] + i) 

Điều này trả về true nếu mảng không chứa số tuần tự.

1

Tương tự như: make sure array is sequential in C#

trả lời có:

nếu bạn chắc chắn rằng mảng được sắp xếp và không có bản sao, bạn có thể chỉ cần kiểm tra:

array[array.Length - 1] == array[0] + array.Length - 1 
+0

Đó là sai, với điều này bạn không thể biết bất cứ điều gì về các yếu tố khác hơn đầu tiên và cuối cùng. – Serge

+0

@Serge đó là lý do tại sao được chỉ định: nếu bạn chắc chắn rằng mảng được sắp xếp và không có trùng lặp. Nếu vậy - câu trả lời là chính xác. Hãy suy nghĩ tại sao! – sara

1
var result = Enumerable.Range(array[0], array[array.Length-1]).Except(array.ToList()); 
2

Sử dụng LINQ:

public static bool IsSequential(int[] a) 
    { 
     return Enumerable.Range(1, a.Length - 1).All(i => a[i] - 1 == a[i - 1]); 
    } 
2

Điều này nên thực hiện thủ thuật, cho tất cả dữ liệu tuần tự, không tuần tự. Một ví dụ hoàn chỉnh với đầu vào mẫu. Tested và hoạt động tốt

var list = new List<int>(new[] { 7, 6, 5, 4, 3,9}); 
int minValue = list.Min(); 
int maxValue = list.Count; 
List<int> test = Enumerable.Range(minValue, maxValue).ToList(); 
var result = Enumerable.Range(minValue, maxValue).Except(list); 
if (result.ToList().Count == 0) 
{ 
    Console.WriteLine("numbers are in sequence"); 
} 
else 
{    
    Console.WriteLine("Numbers are not in sequence"); 
} 
0

loại Đầu mảng, loại bỏ N của một loại (ví dụ như cặp) sử dụng riêng biệt() và Nếu chiều dài mảng luôn == 5 Tất cả bạn cần làm là if ((mảng [4] - mảng [0]) == 4) trả về giá trị true.

Nó trở nên phức tạp hơn nếu tổ hợp texas của nó hoặc nếu bạn cần tính đến cả ace cao và ace thấp thẳng.