作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
面临错误 Panic Runtime Error index out of range [3] with length 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]]
最佳答案
假设您传递了字符串 XII
到你的功能。这使得 len(s)
3
,这意味着你的循环体将(如果没有发生 panic )执行 4 次(当 i
是 0
、 1
、 2
和 3
因为您的条件是 i <= len(s)
。
在 i
的迭代中是 2
(即它指的是 I
中的第二个 XII
,即最后一个字符),当该行
nextInt := romanNum[s[i+1]]
尝试访问下一个字符(
i+1
将是
3
)然后它将超出范围。请记住, slice/数组是
0
索引。这就是 panic 的原因。
i
时没有发生 panic ,那也毫无值(value)。是
2
,那么它肯定会在下一次迭代中发生,其中
i
是
3
, 自
3
超出
s
的范围,在以下行:
currentInt := romanNum[s[i]]
要解决此问题,您需要重新考虑如何处理循环条件。使用
<=
这里很可能会给你带来问题。此外,在循环体中,您需要考虑当您查看字符串中的最后一个字符时,没有下一个字符,但您的代码只是假设有。解决这两个问题应该可以帮助您克服问题。
关于arrays - 紧急运行时错误索引超出范围 [3],长度为 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63431500/
经过一周时间的Log4j2 RCE事件的发酵,事情也变也越来越复杂和有趣,就连 Log4j 官方紧急发布了 2.15.0 版本之后没有过多久,又发声明说 2.15.0 版本也没有完全解决问题,然
我是一名优秀的程序员,十分优秀!