クロージャを使用して最大連続する正の数を数える方法は?スワイプ最大連続する正の数
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
クロージャを使用して最大連続する正の数を数える方法は?スワイプ最大連続する正の数
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
更新:簡単な解決策: 陽性元素のスライスにアレイを分割し、最大のスライスの長さを決定する:
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()!
に変更可能性が大きい場合。
var currentResult = 0
var maxResult = 0
for i in numbers {
currentResult = i > 0 ? currentResult + 1 : 0
if maxResult < currentResult {
maxResult = currentResult
}
}
print(maxResult)
クロージャない溶液
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を返します。 –
@MartinRあなたが正しいです!問題はありましたが、修正されました。乾杯:) – Arsen
生成サブ:我々は数字で番号を探し
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)")
:1,3,4 - その3。その後、2つの負の数、2正3ネガティブとポジティブ1 - すべての肯定は、我々は彼らを数えます。したがって、最大連続した正の数 - 3。 – Anton