You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R×C矩阵删除行代码异常求助:行数≥4时删除行丢失最后一行

解决矩阵删除行时的异常问题

嘿,我一眼就发现了你代码里的两个关键问题,这就是为啥行数≥4时会出问题的原因!咱们一步步拆解:

问题1:删除第一行时的循环范围越界

你看这段代码:

if(k==0){
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            a[i][j]=a[i+1][j];
        }
    }
}

当你删除第一行(k=0)时,循环条件是i < r,这意味着最后一次循环会到i = r-1,此时你访问a[i+1][j]也就是a[r][j]——这已经超出了原矩阵的行范围(原矩阵行索引是0到r-1),会读取到内存里的随机垃圾值,这就是你测试场景里出现奇怪数字(比如0、5、1、2)的罪魁祸首!

问题2:删除非第一行时的逻辑不完整

再看else分支:

}else{
    for (int j = 0; j < c; j++) {
        a[k][j]=a[k+1][j];
    }
}

你只把待删除的第k行替换成了k+1行的内容,但后面的所有行都没有向上移动。比如4行的矩阵(索引0-3),要删除第2行(k=1),你只更新了a[1],但a[2]还是原来的a[2],然后r减1变成3,这时候矩阵的最后一行(原a[3])直接被丢弃,而中间的行还重复了,自然会出现数据丢失或错误。

修正后的代码

把两个问题都 fix 掉之后,代码应该是这样的:

// k为待删除的行号(假设行索引从0开始)
if (k == 0) {
    // 删除第一行:从第0行到倒数第二行,依次替换为下一行
    for (int i = 0; i < r - 1; i++) {
        for (int j = 0; j < c; j++) {
            a[i][j] = a[i+1][j];
        }
    }
} else {
    // 删除非第一行:从第k行到倒数第二行,依次替换为下一行
    for (int i = k; i < r - 1; i++) {
        for (int j = 0; j < c; j++) {
            a[i][j] = a[i+1][j];
        }
    }
}
r--;

修正逻辑说明

不管删除哪一行,我们都从待删除的行索引开始,循环到原矩阵的倒数第二行(也就是i < r-1),把每一行都替换成下一行的内容——这样所有后面的行都会向上移动一格,完美覆盖待删除的行。最后把行数减1,就彻底移除了目标行,既不会访问越界,也不会丢失任何有效数据。

比如你测试的4×4矩阵,删除第1行(k=0):

  • 循环i从0到2(因为r-1=3,r-2=2)
  • i=0时,a[0]替换为a[1];i=1时,a[1]替换为a[2];i=2时,a[2]替换为a[3]
  • r减1后变成3,此时矩阵的行0-2就是原矩阵的行1-3,完全符合预期。

内容的提问来源于stack exchange,提问作者MinhTris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:22:43