如何优化操作字符串的代码?

时间:2017-02-07 22:16:00

标签: swift

我正在努力为这个Hackerrank问题提出更快的解决方案:https://www.hackerrank.com/challenges/30-review-loop

简而言之,我必须将每个输入字符串分成两个字符串,第一个字符串具有原始字符串的偶数索引字符,第二个字符串具有奇数索引。 要分隔的字符串数保存为numStrings常量,字符串本身存储在inputString中。

import Foundation

let numStrings = Int(readLine()!)!

func printEvenAndOdd(string: String) {       
    var firstString = ""
    var secondString = ""
    var stringIndex = string.index(string.startIndex, offsetBy: 0) 

    for index in 0..<string.characters.count {
        stringIndex = string.index(string.startIndex, offsetBy: index) 

        if index % 2 == 0 {            
            firstString += String(string[stringIndex])
        } else {
            secondString += String(string[stringIndex])
        }
    }           
    print(firstString + " " + secondString)
}

for _ in 1...numStrings {
    let inputString = readLine()!
    printEvenAndOdd(string: inputString)
}

我的代码有效,但由于超时而导致最后3次测试失败。我可以更快地制作算法吗?

2 个答案:

答案 0 :(得分:2)

func index(_ i: String.Index, offsetBy n: String.IndexDistance) -> String.Index

是O(n),这意味着随着n的增加它会变慢。所以字符串越长,算法运行的速度就越慢。

要在O(1)时间内访问字符,您应该使用for char in string.characters来获取字符。

如果使用string.characters.enumerated(),您将获得一系列元组,其中包含字符索引和字符本身。然后你的代码变成:

func printEvenAndOdd(string: String) {
    var firstString = ""
    var secondString = ""

    for (index, char) in string.characters.enumerated() {
        if index % 2 == 0 {
            firstString += String(char)
        } else {
            secondString += String(char)
        }
    }
    print(firstString + " " + secondString)
}

答案 1 :(得分:1)

根据Swift String referenceindex(_, offsetBy)函数执行复杂度O(n),导致O(n^2)的总复杂度。以下功能应该更好:

func printEvenAndOdd(string: String) {
    var firstString = ""
    var secondString = ""
    var i = 0

    for c in string.characters {
        if i % 2 == 0 {
            firstString += String(c)
        } else {
            secondString += String(c)
        }
        i += 1
    }
    print(firstString + " " + secondString)
}