Quelque chose ne va pas avec l'index de chaîne lors de la vérification et de la suppression de symboles. Comment puis-je l'améliorer?
M
1000
MCMXCIV
CM
1900
MCXCIV
XC
1990
MCXIV
IV
1994
MCXI
Fatal error: Can't advance past endIndex
5 Réponses :
let romanDigits: [Substring: Int] = ["I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000] let romanSums: [Substring: Int] = ["IV" : 4, "IX" : 9, "XL" : 40, "XC" : 90, "CD" : 400, "CM" : 900] func romanToInt<S: StringProtocol>(_ s: S) -> Int where S.SubSequence == Substring { if s.isEmpty { return 0 } if let value = romanSums[s.prefix(2)] { return value + romanToInt(s.dropFirst(2)) } else if let value = romanDigits[s.prefix(1)] { return value + romanToInt(s.dropFirst(1)) } else { fatalError("Invalid string") } } let check = romanToInt("MCMXCIV")
Vous modifiez la chaîne que vous êtes itération, de sorte que vos indices deviennent invalides. Au lieu de cela, vous pouvez ajouter un skipchar code> booléen qui dit que vous avez déjà géré le caractère suivant, puis ignorez ce caractère en exécutant
Continuer code>:
1994
Vous militatez STR code> à l'intérieur de la boucle, son indice de fin va changer, dans ce cas, il devient inférieur à sa valeur initiale. Vous pouvez corriger votre code en vérifiant que vous n'avez pas dépassé le
endindex code> sur chaque itération en utilisant une boucle tandis que:
var index = str.startIndex
while index < str.endIndex {
...
//Before the closing curly brace of the while loop
index = str.index(after: index)
}
Utiliser Réduire code> pour le faire circuler ici:
J'essayais de reproduire un crash signalé par un utilisateur mon utilisé avec le même message Votre même code signalerait ne peut pas avancer après endindex code> mais je n'ai pas pu le faire. Votre code m'a aidé à déterminer que cette erreur a changé dans les versions ultérieures de Swift. P>
ne peut pas augmenter au-delà de l'endindex code> avec Swift 4.x Bibliothèques d'exécution, et
L'index de chaîne est hors limites code> avec 5.x. Les numéros de version exacts pour les modifications que je ne connaissent pas. Mais je soupçonne qu'il est 4.0.0 et 5.0.0 .- p>
Dupliqué possible de Stackoverflow.com/questions/36949453/...
@Leodabus Votre solution le plus rapide sur LEETCode (32 ms en supprimant le
Guard code> et
UpperCased () code> pour la vitesse) Leetcode.com/problems/roman-a-integer