#arrays #go #indexing #panic
# #массивы #Вперед #индексирование #паника
Вопрос:
Я инициализировал динамический массив, но он показывает индекс вне диапазона. Я также пытался указать фиксированную длину, но она также показывает ту же ошибку. Описание ошибки: паника: ошибка во время выполнения: индекс вне диапазона [4] с длиной 4
package main
import "fmt"
func missingNumber(nums []int) int {
arrSum := 0
arrLen := len(nums) 1
for i := 0; i < arrLen; i {
arrSum = nums[i]
}
numSum := arrLen * (arrLen 1) / 2
missingNumber := numSum - arrSum
return missingNumber
}
func main() {
nums := []int{1, 3, 4, 5}
result := missingNumber(nums)
fmt.Println(result)
}
Комментарии:
1. Проблема :
arrLen := len(nums) 1
. должно быть толькоarrLen := len(nums)
.
Ответ №1:
вам следует перейти arrLen := len(nums) 1
на arrLen := len(nums)
.
Длина вашего массива равна 4. для этого индексы равны 0,1,2,3. но когда вы попытались сделать arrLen := len(nums) 1
. arrlen
значение сейчас 5
. но у вас есть только 4 элемента. и из вашего цикла вы пытаетесь получить элемент, которого нет в массиве. это выдаст вам ошибку времени выполнения, и это вызовет панику.
этот будет работать на вас:
package main
import "fmt"
func missingNumber(nums []int) int {
arrSum := 0
arrLen := len(nums)
for i := 0; i < arrLen; i {
arrSum = nums[i]
}
m := arrLen 1
numSum := m * (m 1) / 2
missingNumber := numSum - arrSum
return missingNumber
}
func main() {
nums := []int{1, 3, 4, 5}
result := missingNumber(nums)
fmt.Println(result)
}
Ответ №2:
Вот исправление в вашей программе, чтобы найти единственное пропущенное число из последовательности натуральных чисел. Вы индексировали числа массивов [len (nums) 1] за пределами вашего массива. Если разрешено, это должно получить доступ к случайной памяти и прочитать любое значение мусора как законное, и вы даже не узнаете о таких труднодоступных ошибках. Хорошо, что Go проверяет, что вы получаете доступ только к тем элементам в массиве, которые есть, а не за их пределами. Прочитайте это в спецификациях Go
package main
import "fmt"
func missingNumber(nums []int) int {
arrSum := 0
arrLen := len(nums)
for i := 0; i < arrLen; i {
arrSum = nums[i]
}
//let n be the total natural number: which will be provided plus 1 missing
n := arrLen 1
numSum := n * (n 1) / 2
missingNumber := numSum - arrSum
return missingNumber
}
func main() {
nums := []int{1, 3, 4, 5}
result := missingNumber(nums)
fmt.Println(result)
}
В качестве альтернативы вы можете использовать цикл диапазона для обеспечения безопасности or _, i := range nums { ...
:
package main
import "fmt"
func missingNumber(nums []int) int {
arrSum := 0
arrLen := len(nums)
for _, i := range nums {
arrSum = i
}
//let n be the total natural number; which will be provided plus 1 missing
n := arrLen 1
numSum := n * (n 1) / 2
missingNumber := numSum - arrSum
return missingNumber
}
func main() {
nums := []int{1, 3, 4, 5}
result := missingNumber(nums)
fmt.Println(result)
}