我正在努力为这个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次测试失败。我可以更快地制作算法吗?
答案 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 reference,index(_, 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)
}