如何解决紧急运行时错误索引超出范围[3],长度为3
遇到错误Panic Runtime Error索引超出范围[3],长度为3。以下错误似乎表明索引超出范围或长度
panic: runtime error: index out of range [3] with length 3
main.romanToInt(0xc000022080,0x3,0x8)
solution.go,line 15
main.__helper__(...)
solution.go,line 30
main.main()
solution.go,line 58
func romanToInt(s string) int {
romanNum := map[byte]int{
'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,}
var sum int = 0
for i := 0; i <= len(s); i++ {
currentInt := romanNum[s[i]]
nextInt := romanNum[s[i+1]]
if currentInt < nextInt {
sum = sum + (nextInt - currentInt)
i += 1
} else {
sum = sum + currentInt
}
}
return sum
}
指向错误
nextInt := romanNum[s[i+1]]
解决方法
对于i = len(s)-1,表达式s [i + 1]访问索引s [len(s)],该索引无效。您正在访问的索引不存在。即使您对其进行了修复,您的循环范围也会包含len,因此下次s [i]左右将超出范围。
,让我们将字符串XII
传递给函数。这使得len(s)
3
,这意味着循环的主体(如果没有发生紧急情况)将执行 4 次(当i
为{ {1}},0
,1
和2
,因为您的情况是3
。
在i <= len(s)
为i
的迭代中(即,它是指2
中的第二个I
,最后一个字符),
XII
尝试访问下一个字符(nextInt := romanNum[s[i+1]]
将是i+1
),然后它将超出范围。请记住,切片/数组是3
索引的。这就是引起恐慌的原因。
如果0
为i
时没有发生恐慌,那么肯定会在下一轮迭代中发生,其中2
为i
,因为3
在以下行中超出3
的范围:
s
要解决此问题,您需要重新考虑如何处理循环情况。在此处使用currentInt := romanNum[s[i]]
可能会给您带来问题。另外,在循环体内,您需要考虑的是,当您查看字符串中的最后一个字符时,没有是下一个字符,但是您的代码只是假设存在。解决这两个问题应该可以帮助您克服这个问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。