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

锯齿数组gMul移位结果不符合预期的技术问题

问题分析与修复:锯齿数组移位后结果不符合预期

我来帮你排查问题所在并修复代码!你的问题主要有两个核心原因:数组引用共享和移位逻辑错误,咱们一步步来解决:

为什么会出现gMul[3]和gMul[2]相同的情况?

你的shift函数犯了一个常见的错误:它直接修改了传入的原数组,并且返回的是原数组的引用,而不是创建一个新数组。

在循环中:

  • 当i=1时,shift(gMul[0])修改了gMul[0]本身,然后gMul[1] = shifted让它和gMul[0]指向同一个数组
  • 当i=2时,shift(gMul[1])还是在修改同一个数组,gMul[2]也指向这个数组
  • 同理,i=3时依然操作的是同一个数组对象

最终gMul的所有元素都共享同一个数组引用,所以看起来多个位置的结果都一样。

你的移位逻辑也不符合预期

除了引用问题,你原始的shift函数逻辑并没有实现你想要的循环右移效果。根据你的预期,我们需要实现循环右移一位的逻辑:把数组最后一个元素移到第一位,其余元素依次向后移动一位。

修复后的完整代码

修正后的shift函数(创建新数组,实现正确移位)

public byte[] shift(byte[] row) {
    int length = row.Length;
    byte[] newRow = new byte[length];
    
    // 循环右移一位:最后一个元素放到首位,其余元素依次后移
    newRow[0] = row[length - 1];
    for (int i = 1; i < length; i++) {
        newRow[i] = row[i - 1];
    }
    
    return newRow;
}

保持不变的循环代码(现在每次得到独立的新数组)

for (int i = 1; i < gMul.GetLength(0); i++) { 
    byte[] shifted = shift(gMul[i - 1]); 
    gMul[i] = shifted; 
}

验证修复结果

用你的测试例子验证:

  • gMul[0] = new byte[] {2 , 3 , 2 , 2}
  • gMul[1]会得到{2 , 2 , 3 , 2}
  • gMul[2]会得到{2 , 2 , 2 , 3}
  • gMul[3]会得到{3 , 2 , 2 , 2}

完全符合你的预期!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:44:10