Vous avez peut-être entendu dire que "utilisez string.isEmpty
au lieu de string.count == 0
"lorsque vous voulez savoir si une chaîne est vide.
La raison en est que var count: Int
in String
est $ O (n) $, mais var is Empty: Bool
est $ O (1) $ [^ String.isEmpty].
[^ String.isEmpty]: Référence: Pourquoi isEmpty est meilleur que count == 0
Alors, comment savoir si le «compte» d'une chaîne est égal à un nombre quelconque?
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
//Pensez ici
}
}
Le plus simple serait:
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
return self.count == expectedCount
}
}
let string = "Qiita"
print(string.countIsEqual(to: 1)) // -> false
print(string.countIsEqual(to: 5)) // -> true
print(string.countIsEqual(to: 10)) // -> false
mais attendez un instant. J'ai utilisé ʻis Empty pour vérifier si la chaîne était vide parce que
countétait $ O (n) $. Ce
countIsEqual appelle en interne
count`. Si «self» ne contient au plus que quelques caractères, c'est acceptable, mais si «self» peut contenir 10 millions de caractères, il ne peut pas être ignoré.
Considérez un moyen de ne pas appeler «count».
Si vous n'utilisez pas count
, vous devez le compter vous-même. Mais si vous le comptez vous-même, vous pouvez arrêter de compter quand il dépasse le «nombre attendu».
Alors maintenant:
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
guard expectedCount >= 0 else { return false }
var countNow = 0
for _ in self {
countNow += 1
if countNow > expectedCount {
return false
}
}
return countNow == expectedCount
}
}
let string = "Qiita"
print(string.countIsEqual(to: 1)) // -> false
print(string.countIsEqual(to: 5)) // -> true
print(string.countIsEqual(to: 10)) // -> false
C’est facile, non?
Au fait, c'est aussi $ O (n) $, mais dans ce cas, $ n $ est "le plus petit de count
et de ʻespected Count". Fondamentalement, si «count» et «attendu Count» ne changent pas beaucoup, la première implémentation simple peut être meilleure. Cependant, s'il y a une possibilité qu'une grande chaîne de caractères entre (intentionnellement ou non) en raison d'une entrée externe, par exemple, et que ʻexpectedCount
devrait prendre une petite valeur, cliquez ici. La mise en œuvre de est plus utile.