2015-10-06 25 views
5

Tôi có một mảng m của số nguyên. Tôi đang tìm một phương pháp để kiểm tra xem các phần tử của m có liên tiếp không. Có cách nào để kiểm tra các số liên tiếp không?Kiểm tra các số liên tiếp

tôi đã đưa ra với mã này có ý định làm việc khi chiều dài mảng là bốn:

m.count == 4 && (m.max-m.min) == 3 

mà không đúng cách trả true cho [1,1,1,4] hoặc [0,0,0,3].

+0

nào bạn muốn '[4,6, 5,7] để vượt qua? – illusionist

+0

Đơn giản nhất có thể ?: 'm.count == 4 && (m.size-1) .times.all? {| i | m [i + 1] == m [i] + 1} '. –

+0

@illusionist, xem [Wiki này] (https://simple.wikipedia.org/wiki/Consecutive_integer) để biết định nghĩa các số nguyên liên tiếp. Vì vậy, '[4,6,5,7]' sẽ trả về 'false'. –

Trả lời

4

Enumerable có một phương pháp thực sự tiện dụng gọi each_cons mà làm việc như thế này:

[1,2,3,4].each_cons(2).to_a # => [ [1, 2], [2, 3], [3, 4] ] 

Nghĩa là, nó mang lại mỗi bộ liên tiếp n yếu tố. Trong trường hợp của chúng tôi n là 2.

Tất nhiên, như tên của nó, nó sẽ trả về một Enumerator, vì vậy chúng tôi có thể chuỗi nó với các phương pháp khác như Enumerable all?:

def four_consecutive?(arr) 
    return false unless arr.size == 4 
    arr.each_cons(2).all? {|a, b| b == a + 1 } 
end 

four_consecutive?([2,3,4,5]) # => true 
four_consecutive?([2,2,2,5]) # => false 
four_consecutive?([1,2,3,4,5]) # => false 

Phương pháp này có ưu điểm phía trên những người khác, bởi vì all? ngắn mạch ngay sau khi khối trả về sai, nó sẽ chỉ kiểm tra số cho đến khi nó tìm thấy một cặp không đáp ứng các điều kiện (b == a + 1). Tất nhiên, chỉ với bốn yếu tố, điều này không thực sự tạo ra sự khác biệt - trừ khi bạn đang gọi phương thức này hàng nghìn lần trong tình huống hiệu suất.

+1

Tôi quên cảm ơn bạn! – mdalmau

4

Bạn có thể thử này:

a == (a.min..a.max).to_a && a.count == 4 

này chỉ hoạt động khi mảng là thứ tự tăng dần. [3, 4, 5, 6] sẽ vượt qua nhưng [4, 3, 5, 6] thì không.

+0

Tôi nghĩ rằng điều này không vượt qua '[4, 3, 5, 6]' – illusionist

+0

@illusionist, trả về false, như nó cần. Tuy nhiên, có một vấn đề, vì 'a = [1,2,3]' trả về 'true' mặc dù' a' không chứa các phần tử '4'. –

+0

@CarySwoveland đã chỉnh sửa để đưa 'a.count' vào xem xét – izaban

2

câu trả lời dựa trên vấn đề toán học cho Sum of consecutive integers

Sum = n∗(n+1)/2 

Code:

def check_sum_match?(arr) 
    m = arr.min - 1 
    n = arr.max 
    sum1 = arr.inject{|sum, x| sum = sum + x} 
    sum2 = (n*(n+1) - m*(m+1))/2 
    sum1 == sum2 
end 

arr = [5,6,7,8] 
if arr.count == 4 && check_sum_match?(arr) 
    puts 'Yes condition matches' 
else 
    puts 'Invalid Array' 
end 
# valid arrays are 
# [4,6,5,7], [4,5,6,7], etc 

Giải thích dự kiến:

enter image description here

+0

Wow! Ấn tượng. Tôi đã phải viết ra một số con số để hiểu nó, nhưng chắc chắn hoạt động. Bạn có nghĩ rằng có một cách khác để làm điều này mà không biến thành một phương pháp? – mdalmau

+3

Như bạn nói, '[4,6,5,7]' trả về 'true', nhưng nó phải là' false', vì các phần tử không liên tiếp. Ngoài ra, '[3,4,5]' trả về 'true' mặc dù nó không chứa các phần tử' 4'. –

+1

Địa ngục yeah! Phương pháp tuyệt vời nhất – asiniy

3

Nếu a là mảng và.210 là kích thước yêu cầu:

def size_and_consecutive?(a, n) 
    a == (a.first..(a.first+n-1)).to_a 
end 

size_and_consecutive? [3,4,5,6], 4 
    #=> true 
size_and_consecutive? [4,3,5,6], 4 
    #=> false 
size_and_consecutive? [3,4,5], 4 
    #=> false 
0

Một giải pháp nhỏ gọn mà tôi có thể đưa ra như sau:

def consec(arr) 
    is_of_proper_length = (arr.size == 4) 
    if(is_of_proper_length) 
    are_consec = true 
    arr.each_cons(2) {|x,y| are_consec = false unless ((y - x) == 1)} 
    end 
    is_of_proper_length && are_consec 
end 

Output:

consec([1,2,3,4]) 
=> true 
2.2.0 :051 > consec([0,0,0,0]) 
=> false 
2.2.0 :052 > consec([4,6,5,7]) 
=> true 
2.2.0 :053 > consec([4,5,6,7]) 
=> true 
2.2.0 :054 > consec([5,6,7,8]) 
=> true 
2.2.0 :055 > consec([2,2,2,5]) 
=> false 
2.2.0 :056 > consec([2,3,4,5]) 
=> true 
2.2.0 :057 > consec([1,2,3,4,5]) 
=> false 
+0

Các phần tử của '[4,6,5,7]' không liên tiếp, vì vậy 'false' phải được trả về. –

+0

để có được 'sắp xếp_arr.last' bạn không cần phải sắp xếp, chỉ cần' arr.max' là đủ – illusionist

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