J'ai essayé de résoudre la question ci-dessous sur codingbat:
"Étant donné un tableau d'entiers, renvoie True si la séquence de nombres 1, 2, 3 apparaît quelque part dans le tableau".
C'était ma solution qui a renvoyé l'erreur "index hors plage":
def array123(nums): for i in range(len(nums)-2): if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3: return True return False
C'était la solution de Codingbat:
def array123(nums): for i in range(len(nums)): if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3: return True return False
Je sais que je rate un truc ici. Quelqu'un pourrait-il expliquer pourquoi je dois itérer sur la plage (len (nums) -2) ??
Merci.
3 Réponses :
ce n'est pas exactement une solution étonnante non plus, ce serait correct:
True
def array123(nums): for i in range(len(nums)-2): if nums[i:i+3] == [1,2,3]: return True return False print(array123([1,2,3]))
la principale différence entre votre code et celui de codingbat est la façon dont la plage est utilisée
votre plage est la longueur de la liste, non? Donc, puisque vous ajoutez à l'index de 2 au cas le plus élevé, nous ne devrions itérer que jusqu'à la longueur - 2, car tout ce qui dépasse l'index le plus élevé
Ils ont utilisé len (num) -2, de sorte que le num [i + 2] pointe vers le dernier élément et non vers un index en dehors du num
C'est parce que vous vérifiez les éléments i, i + 1 et i + 2 de la boucle. La condition est de vérifier 1, 2, 3 dans le tableau n'importe où. et dans les index python commençant à zéro, donc range (len (num) -2) le fait itérer sur 0 à 7, s'il s'agit d'un tableau de 10 éléments.
Puisque vous accédez à 3 nombres à la fois, il vous suffit d'itérer jusqu'à
range(len(nums)-2)
.Eh bien, dans vos propres mots, quelles valeurs de
i
allez-vous créer avec chaque solution? Que se passe-t-il lorsque vous essayez d'utiliseri+2
pour indexer ennums
, lorsquei
est la plus grande valeur possible?