2011-01-02 73 views
6

Làm cách nào để tìm số của tất cả chuỗi (kết hợp của một mảng có ít nhất 3 giá trị liên tiếp, như [7,8,9]) và có số giá trị dài nhất?tìm tất cả chuỗi trong một mảng

từ [3,4,1,2,2] nó sẽ là 2 - ([1,2,3,4] hai lần, nhưng bỏ qua [1,2,3] * 2 và [2,3, 4] * 2)

từ [9,6,7,5,8] nó sẽ là 1 - ([5,6,7,8,9])

từ [1,2,3 , 1,2] nó sẽ là 4 ([1,2,3] * 3)

Cảm ơn


chỉnh sửa

điểm của việc này là đếm số lần chạy trong tay crib. Không quan trọng thứ tự mảng có chuỗi trong, miễn là chuỗi được tính không trùng lặp tất cả các thẻ.


chỉnh sửa 1

var $cards:Array = [9, 4, 3, 2, 2]; 
var $ranks:Array = []; 
var $c:int; 
for each ($c in $cards) { 
    if ($ranks[$c] == null) { 
     $ranks[$c] = 1; 
    }else { 
     $ranks[$c] ++; 
    } 
} 

này sẽ tạo ra một mảng ($ bậc) mà sẽ có những giá trị [2:2, 3:1, 4:1, 9:1]

từ này tôi sẽ có thể nhân lên các giá trị dưới 2, 3 ad4 4 và nhân chúng với 3, vì vậy tôi sẽ nhận được 2 * 1 * 1 * 3

Tôi đang cố gắng tìm ra cách tìm liên tiếp các giá trị và bỏ qua các giá trị không phải (như 9)

+0

liên tiếp từ đầu của Array hoặc từ bất cứ nơi nào ? – Patrick

Trả lời

1

hoạt động này: bằng cách sử dụng casalib cho min/max, nhưng có nhiều cách khác xung quanh nó. onlu này tìm thấy tập hợp số lớn nhất liên tiếp, vì nó có nghĩa là đếm tay crib có tối đa 5 thẻ, do đó không thể có hai chuỗi đồng thời (như 2,3,4 và 9,10,11)

Tôi tìm các số liên tiếp qua mảng $ seq, bằng cách đẩy giá trị bất cứ khi nào $ ranks [i] có giá trị, nếu độ dài lớn hơn 3 và vắt hơn mảng $ dài nhất, sao chép mảng (với concat()!), nếu không có giá trị, $ seq được đặt lại.

thật đơn giản khi bạn biết ...


chỉnh sửa tôi nhận thấy tôi đã có một lỗi đánh máy trong các mã

if ($seq.length > $longest.length || $seq.length >= 2)

cần phải có được

if ($seq.length > $longest.length && $seq.length > 2)

+0

@Daniel. Bạn có thể sử dụng các hàm 'Math.max' và' Math.min' được tích hợp sẵn, vì chúng chấp nhận các đối số 'rest'. 'Math.max.apply (null, $ cards); ' –

+0

Bạn cũng có thể sắp xếp $ thẻ bằng cách sử dụng $ cards.sort() và sau đó lấy đầu tiên và cuối cùng. – Nicholas

+0

đây là một mẹo hay, không biết về điều này. Tôi nhìn vào casalib để xem cách đó được thực hiện (thấp nhất) 'return inArray [inArray.sort (16 | 8) [0]];'. Tôi tò mò làm thế nào nó so sánh với Math.min – Daniel

2

Bạn muốn đặt giá trị của mình và thay thế tất cả các từ khóa trùng lặp bằng một mảng của chúng. I E.

//Order values and group matches 
[3,4,1,2,2] = [1,[2,2],3,4] 
[9,6,7,5,8] = [5,6,7,8,9] 
[1,2,3,1,2] = [[1,1],[2,2],3] 

Sau đó, bạn sẽ muốn tìm chuỗi liên tiếp lớn nhất và xóa vi phạm.

//remove violations (6,7,8)... which I guess you also want to count separately. 
[1,[2,2],3,4,6,7,8] = [1,[2,2],3,4] 

Sau đó, việc nhân chiều dài của tất cả các mảng để tìm điểm số của bạn sẽ là vấn đề.

Khi bạn đã làm sạch mảng của mình, bạn có thể nghĩ về công thức như thế này.

array2 = [2,2]; 
array1 = [1, array2, 3, 4]; 
score = array1.length * array2.length = 8; 

array3 = [3,3,3]; 
array2 = [2,2]; 
array1 = [1, array2, array3, 4]; 
score = array1.length * array2.length * array3.length = 24; 

Sẽ rất thú vị khi tìm hiểu cách viết mã này.

+0

Tôi đã nhận được quá xa, chỉ cần không chắc chắn làm thế nào để kiểm tra xem trình tự là theo thứ tự, tôi sẽ chỉnh sửa bài để hiển thị những gì tôi có cho đến nay (chỉnh sửa 1) – Daniel

+0

bạn có thể sử dụng array.sortOn để đặt nó trong gọi món. – Nicholas

+0

nhưng nó không nói với tôi rằng 9 là một lẻ ra – Daniel

Các vấn đề liên quan