首页 文章

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

提问于
浏览
0

我想为这个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 回答

  • 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

    根据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)
    }
    

相关问题