2017-11-06 9 views
4

クロージャを使用して最大連続する正の数を数える方法は?スワイプ最大連続する正の数

var numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5] 
//in this case it should be 3 

print(numbers.reduce(0, { $1 > 0 ? $0 + 1 : $0 }))//this counts total positive numbers 
+0

:1,3,4 - その3。その後、2つの負の数、2正3ネガティブとポジティブ1 - すべての肯定は、我々は彼らを数えます。したがって、最大連続した正の数 - 3。 – Anton

答えて

6

更新:簡単な解決策: 陽性元素のスライスにアレイを分割し、最大のスライスの長さを決定する:

let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5] 
let maxConsecutive = numbers.split(whereSeparator: { $0 <= 0 }).map { $0.count }.max()! 
print(maxConsecutive) // 3 

旧答え:)のアイデアを使用してSwift running sumから:

let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5] 

let maxConsecutive = numbers.map({ 
    () -> (Int) -> Int in var c = 0; return { c = $0 > 0 ? c + 1 : 0; return c } 
}()).max()! 
ここ

map()は、この場合には、要素の位置まで連続した正 数のカウントに各配列要素をマッピングし

[1, 2, 3, 0, 0, 1, 2, 0, 0, 0, 1] 

変換は、 の現在の数を保持する変数cをキャプチャするために、「すぐに評価された クロージャ」として作成されます連続する正の数。変換は、c、 をインクリメントまたはリセットし、更新された値を返します。

アレイは、最大ランレングスが 中間アレイを作成せずに決定されるように、次いで

let maxConsecutive = numbers.lazy.map(...).max()! 

に変更可能性が大きい場合。

+0

ありがとう、それは私が欲しいものです - シンプルで短いソリューション!平均的な連続する正の数を見つけるにはどうすればよいですか?マップでは、[1,2,3,0,0,1,2,0,0,0,1]、今何を使用してフィルタリングし、減らすのですか?結果は[3,2,1]でなければなりません。その後、合計6をカウント3 = 2で除算します。 – Anton

+0

@Anton:あなたの新しい質問に触発されて、私はずっと簡単な解決策でこの答えを更新しました。 –

+0

多くのありがとうございます! – Anton

2
var currentResult = 0 
var maxResult = 0 
for i in numbers { 
    currentResult = i > 0 ? currentResult + 1 : 0 
    if maxResult < currentResult { 
     maxResult = currentResult 
    } 
} 
print(maxResult) 

クロージャない溶液

+0

ありがとう、しかし私は閉鎖で解決策が必要です) – Anton

+0

print(numbers.reduce(0){$ 1> 0?$ 0 + 1:0})正の数。クロージャ(この場合は3)を使用して最大連続数を得るにはどうすればよいですか? – Anton

+0

これは、配列 '[1,2,3,4]' –

2
var numbers = [1, 3, 4, -1, -2, 5, 2, -2, -3, -4, 5] 

let result = numbers.reduce((current: 0, max: 0)) { result, number in 
    var value = result 

    if number > 0 { 
     value.current += 1 
     value.max = max(value.current, value.max) 
    } else { 
     value.current = 0 
    } 

    return value 
} 



result.max 
+0

良いアイデアですが、いくつかの問題があるようです。指定された配列に対して0を返します。 –

+1

@MartinRあなたが正しいです!問題はありましたが、修正されました。乾杯:) – Arsen

1

生成サブ:我々は数字で番号を探し

let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5] 
let subsequences: [[Int]] = numbers.reduce(into: []) { (result, number) in 
    guard 
     var currentSequence = result.last, 
     let lastNumber = currentSequence.last 
    else { 
     result = [[number]] 
     return 
    } 

    if number == lastNumber + 1 { 
     currentSequence.append(number) 
     result.removeLast() 
     result.append(currentSequence) 
    } else { 
     result.append([number]) 
    } 
} 
let longest = subsequences.max { $0.count < $1.count } 
print(subsequences) 
print("Longest subsequence: \(longest)") 
print("Longest length: \(longest?.count)") 
関連する問題