После решения этой проблемы на LeetCode: https://leetcode.com/problems/count-and-say/ мое первое решение заняло 16 мс. Удалив оператор else, без (насколько я могу судить) изменения логики c каким-либо образом, время выполнения сократилось до 8 мс. %.
Кто-нибудь может объяснить, почему? Мне кажется, что они должны быть одинаковыми.
func countAndSay(_ n: Int) -> String {
if n == 1 {
return "1"
}
var output = ""
let previous = countAndSay(n-1)
var count = 0
var lastChar = Character("0")
for (n, c) in previous.enumerated() {
if n == 0 {
lastChar = c
count = 1
} else {
if c == lastChar {
count += 1
} else {
output += "\(count)\(lastChar)"
count = 1
lastChar = c
}
}
}
output += "\(count)\(lastChar)"
return output
}
Я изменил для l oop на это и сократил время пополам:
for (n, c) in previous.enumerated() {
if n == 0 {
lastChar = c
count = 1
continue
}
if c == lastChar {
count += 1
} else {
output += "\(count)\(lastChar)"
count = 1
lastChar = c
}
}