-3
votes

Ne peut pas avancer après endindex rapide

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? XXX PRE>

Console Connexion: strong> P>

M
1000
MCMXCIV
CM
1900
MCXCIV
XC
1990
MCXIV
IV
1994
MCXI
Fatal error: Can't advance past endIndex


2 commentaires

Dupliqué possible de Stackoverflow.com/questions/36949453/...


@Leodabus Votre solution le plus rapide sur LEETCode (32 ms en supprimant le Guard et UpperCased () pour la vitesse) Leetcode.com/problems/roman-a-integer


5 Réponses :


2
votes
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")

0 commentaires

2
votes

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>: xxx pré>

1994


0 commentaires

0
votes

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)
}


0 commentaires

1
votes

Utiliser Réduire pour le faire circuler ici: xxx


0 commentaires

0
votes

J'essayais de reproduire un crash signalé par un utilisateur mon utilisé avec le même message ne peut pas avancer après endindex 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.

Votre même code signalerait ne peut pas augmenter au-delà de l'endindex avec Swift 4.x Bibliothèques d'exécution, et L'index de chaîne est hors limites 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 .-


0 commentaires