我想为这个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 回答
是O(n),这意味着它随着
n
的增加而变慢 . 所以字符串越长,算法运行的速度就越慢 .要在O(1)时间内访问字符,您应该使用
for char in string.characters
来获取字符 .如果使用
string.characters.enumerated()
,您将获得一系列元组,这些元组包含字符的索引和字符本身 . 然后你的代码变成:根据Swift String reference,
index(_, offsetBy)
函数执行复杂性O(n)
导致O(n^2)
的总复杂性 . 以下功能应该更好: