gpt4 book ai didi

swift - 来自 Codility GenomicRangeQuery in Swift 4.2 的这个前缀 Sum Coding Challenge 的解释

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:37:43 37 4
gpt4 key购买 nike

谁能解释这个前缀和计算是如何工作的,因为我很困惑我的意思是我知道它创建了一个带有字母前缀和的 Ints 数组,但我不明白如何?有人可以发布更天真的逻辑或一些解释吗?或者可能是该 MAP 函数的较短版本,因为它非常复杂。

Link挑战以防万一有人想看一下

public func solution(_ S : inout String, _ P : inout [Int], _ Q : inout [Int]) -> [Int] {
//The mapping below needs the explanation
var prefixSumA = S.map({ () -> (Character) -> Int in
var s = 0; return {
if $0 == "A" {
return (s += 1, s).1
}
return s
}
}())//until here
prefixSumA.insert(0, at: 0)
var prefixSumC = S.map({ () -> (Character) -> Int in
var s = 0; return {
if $0 == "C" {
return (s += 1, s).1
}
return s
}
}())
prefixSumC.insert(0, at: 0)
var prefixSumG = S.map({ () -> (Character) -> Int in
var s = 0; return {
if $0 == "G" {
return (s += 1, s).1
}
return s
}
}())
prefixSumG.insert(0, at: 0)


let iterations = min(P.count, Q.count)

var result = [Int]()

for i in 0...iterations - 1 {
let p = P[i]
let q = Q[i] + 1
if prefixSumA[q] - prefixSumA[p] > 0 {
result.append(1)
} else if prefixSumC[q] - prefixSumC[p] > 0 {
result.append(2)
} else if prefixSumG[q] - prefixSumG[p] > 0 {
result.append(3)
} else {
result.append(4)
}
}
return result
}

最佳答案

prefixSumA 计算从开始到每个给定索引的 A 的数量。 prefixSumCprefixSumG 也是如此。

例如,如果字符串 S"CAGCCTA",我们将有:

prefixSumA = [0, 0, 1, 1, 1, 1, 1, 2]
prefixSumC = [0, 1, 1, 1, 2, 3, 3, 3]
prefixSumG = [0, 0, 0, 1, 1, 1, 1, 1]

(注意开头插入的零。)


这段代码:

var prefixSumA = S.map({ () -> (Character) -> Int in
var s = 0; return {
if $0 == "A" {
return (s += 1, s).1
}
return s
}
}())
prefixSumA.insert(0, at: 0)

返回一个闭包,如果字符是 A,它将捕获 s 的当前值(这是数组中的最后一个值),递增它,结束返回它 (s)。

return (s += 1, s).1 是一种奇特的方式,可以写成:

s += 1
return s

整个 block 可以写得更简单:

var prefixSumA = [0]
var countOfA = 0
prefixSumA += S.map { char in
if char == "A" { countOfA += 1 }
return countOfA
}

prefixSumCprefixSumG 也可以这样做。

关于swift - 来自 Codility GenomicRangeQuery in Swift 4.2 的这个前缀 Sum Coding Challenge 的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55160288/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com