首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swift 3算法-密码标志

swift 3算法-密码标志
EN

Stack Overflow用户
提问于 2018-03-10 06:25:10
回答 1查看 108关注 0票数 0

我试图在Swift 3中解决codility.com上的旗帜问题,下面的代码只得到6%。低分数的原因是b/c --我的代码没有考虑到其他可能的数组,只是问题中给出的数组。必须有一种方法,我可以使用"for循环“,而不是多个"if语句”的底部。如有任何建议或建设性的批评,将不胜感激。谢谢。

代码语言:javascript
复制
import Foundation

var A = [1, 5, 3, 4, 3, 4, 1, 2, 3, 4, 6, 2]

public func solution(_ A : inout [Int]) -> Int {

    let n = A.count

    if n < 3 {  // if there are only two elements in array A, then there are no peaks

        return 0
    }

    var peaks = [Int]()

    for i in 1..<n - 1 {  // loop to find peak indices

        if A[i - 1] < A[i] && A[i] > A[i + 1] {
            peaks.append(i)
        }
    }

    var numFlags = 0

    if peaks[3] - peaks[2] >= peaks.count {
        numFlags += 2
    }

    if peaks[2] - peaks[1] >= peaks.count {
        numFlags += 1
    }

    if peaks[1] - peaks[0] >= peaks.count {
        numFlags += 1
    }

    if peaks[2] - peaks[0] >= peaks.count {
        numFlags += 1
    }

return numFlags

}

print(solution(&A))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 01:14:50

这给了93%的分数,在斯威夫特3关于谦逊的旗帜问题。

代码语言:javascript
复制
import Foundation

var A = [1, 5, 3, 4, 3, 4, 1, 2, 3, 4, 6, 2]

public func solution(_ A : inout [Int]) -> Int {

    let n = A.count  // n = number of indices in A

    var peaks: [Int] = []  // create array for peaks

    if n < 3 {  // you need at least three elements to have a peak
            return 0
        }

    for i in 1...n-2 {  //  loop to determine number of peaks and put them into peaks array
            if A[i - 1] < A[i] && A[i] > A[i + 1] {
                    peaks.append(i)
                }
        }

    if peaks.count == 0 {
            return 0
        }

    var totalMarked = 0

    for i in ((0 + 1)...n).reversed() {
            if (i - 1) * i + 2 > n {  // if this condition is met then iterate for next element
                    continue
                }

            var prevPeak = peaks.first

            var marked = 1

            for j in 1..<peaks.count {
                    if peaks[j] - prevPeak! < i {  // if this condition is met then iterate for next element
                            continue
                        }

                    marked += 1
                    prevPeak = peaks[j]

                    if marked >= i {  // if this condition is met, then exit loop
                            break
                        }
                }

            totalMarked = max(totalMarked, marked)  // take the greater of totalMarked and marked
        }

    return totalMarked
}

print(solution(&A))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49206050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档