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> etUpperCased () code> pour la vitesse) Leetcode.com/problems/roman-a-integer