英文:
panic: runtime error: index out of range [-1]
问题
当我尝试解决LeetCode上的118. 杨辉三角
问题时,出现了奇怪的错误。下面的代码可以通过OJ测试:
func generate(numRows int) [][]int {
res := [][]int{}
for i := 0; i < numRows; i++ {
row := []int{}
for j := 0; j < i+1; j++ {
if j == 0 || j == i {
row = append(row, 1)
} else if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
}
res = append(res, row)
}
return res
}
但是我写的代码如下,却出现了panic错误,但基本逻辑是相同的:
func generate(numRows int) [][]int {
res := [][]int{}
for i := 0; i < numRows; i++ {
row := []int{}
for j := 0; j < i+1; j++ {
if j == 0 || j == i {
row = append(row, 1)
}
if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
}
res = append(res, row)
}
return res
}
我使用了if else if结构,它运行良好,但是我使用了两个if条件判断错误。
实际上,它们的逻辑是相同的,但为什么会出错呢?如果您能解决这个问题,我将不胜感激。祝您好运!
英文:
when I try to solve the leetcode problem of 118. Pascal's Triangle
https://leetcode.com/problems/pascals-triangle/
it occured strange bug. Below the code can pass OJ.
func generate(numRows int) [][]int {
res := [][]int{}
for i := 0; i < numRows; i++ {
row := []int{}
for j := 0; j < i+1; j++ {
if j == 0 || j == i {
row = append(row, 1)
} else if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
}
res = append(res, row)
}
return res
}
But the code I write like this and it occur panic, but the basic logic is same.
func generate(numRows int) [][]int {
res := [][]int{}
for i := 0; i < numRows; i++ {
row := []int{}
for j := 0; j < i+1; j++ {
if j == 0 || j == i {
row = append(row, 1)
}
if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
}
res = append(res, row)
}
return res
}
I used if else if structure, it works fine, but I use 2 if condition judgment error.
In fact, their logic is the same, but why the error? I would be grateful if you could solve this problem. Good lcuk for you!
答案1
得分: 2
问题是在第二个版本中你使用了两个if
条件,而在第一个版本中你使用了一个if else
。
但基本逻辑是相同的
不,逻辑是不同的。结果是当j
为0时,你尝试执行j-1
。
如果你有两个像这样的if
条件,程序将分别进入两个块,只要它们各自的条件满足。
if j == 0 || j == i {
row = append(row, 1)
}
// 只要 i > 1,即使 j 是 0,你仍然会进入这个块
if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
如果第一个if
条件满足,你可以使用continue
跳过这部分。
if j == 0 || j == i {
row = append(row, 1)
// 继续下一次迭代
continue
}
if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
也就是说,在你的代码的第一个版本中使用if else
似乎是合理的。我不确定为什么你想要改变它。
英文:
The problem is that you use 2 if
conditions in the second version, while in the first version you have an if else
.
> but the basic logic is same
No, the logic is not the same. The result is that you try to do j-1
when j
is 0.
If you have 2 if conditions like this, the program will enter both blocks individually if their respective condition is met.
if j == 0 || j == i {
row = append(row, 1)
}
// if j is 0 you still enter this block as long as i > 1
if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
You could use continue
to skip this section, if the first if
is met.
if j == 0 || j == i {
row = append(row, 1)
// continue with the next iteration
continue
}
if i > 1 {
row = append(row, res[i-1][j-1] + res[i-1][j])
}
That said, using the if else
in the first version of your code seems reasonable. I am not sure why you would want to change it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论