arrays - 导致恐慌的原因:运行时错误:索引超出范围 [4],长度为 4,即使数组已初始化为动态数组
问题描述
我已经初始化了一个动态数组,但它显示索引超出范围。我也尝试过给出固定长度,但它也显示了同样的错误。错误描述:恐慌:运行时错误:索引超出范围 [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)
}
解决方案
这是您的程序中的更正,用于从自然数序列中查找单个缺失的数字。您正在索引数组 nums[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)
}
推荐阅读
- python - 我如何将一列值转换为个性化的列标题
- ios - React Native - iOS 模拟器部署目标“IPHONEOS_DEPLOYMENT_TARGET”设置为 7.0
- java - 如何通过以下方法修复 Stackoverflow?
- java - 将 Elastic Search JDBC 驱动程序与 Hibernate / Spring Boot 集成
- activemq - 如何在 ActiveMQ 中使用 JmsPooledConnectionFactory 设置异步发送
- ssl - 从 CRT 和 PEM 文件创建 JKS
- python - 尝试在 Jupyter Notebook 中加载数据集时出现 ConnectionRefusedError
- java - 不应该在 Jbutton.update 上使用 getGraphics(),为什么?
- reactjs - 如何使用reactjs获取检查的数据
- google-colaboratory - 在同一会话期间编码时无法保存两个用户更改