Möglicherweise haben Sie gehört, dass "stringisEmpty" anstelle von "string.count == 0" verwendet wird, wenn Sie herausfinden möchten, ob ein String leer ist. Der Grund ist, dass
var count: Int in
String $ O (n) $ ist, aber
var is Empty: Bool` ist $ O (1) $ [^ String.isEmpty].
[^ String.isEmpty]: Referenz: Warum isEmpty besser ist als count == 0
Wie können Sie also herausfinden, ob die Anzahl einer Zeichenfolge einer beliebigen Zahl entspricht?
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
//Denken Sie hier
}
}
Am einfachsten wäre:
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
aber bitte warte einen Moment. Ich habe isEmpty
verwendet, um zu überprüfen, ob die Zeichenfolge leer war, weil count
$ O (n) $ war. Dieses countIsEqual
ruft intern count
auf. Wenn "Selbst" höchstens ein paar Zeichen enthält, ist dies akzeptabel, aber wenn "Selbst" 10 Millionen Zeichen umfassen kann, kann es nicht ignoriert werden.
Überlegen Sie, wie Sie "count" nicht aufrufen können.
Wenn Sie nicht "count" verwenden, müssen Sie es selbst zählen. Wenn Sie jedoch selbst zählen, können Sie die Zählung beenden, wenn die erwartete Anzahl überschritten wird. Also jetzt:
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
Es ist einfach, oder?
Übrigens ist dies auch $ O (n) $, aber in diesem Fall ist $ n $ "der kleinere Wert von" count "und" expectedCount "". Grundsätzlich kann die erste einfache Implementierung besser sein, wenn sich "count" und "expectedCount" nicht so stark ändern. Wenn jedoch die Möglichkeit besteht, dass beispielsweise aufgrund externer Eingaben eine große Zeichenfolge eingeht (ob beabsichtigt oder nicht) und "expectedCount" voraussichtlich einen kleinen Wert annimmt, klicken Sie hier. Die Implementierung von ist nützlicher.
Recommended Posts