You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#字符串重排功能异常:数组元素移动逻辑错误求助

问题排查与修复

嘿,我来帮你搞定这个字符串顺序调整的问题!首先咱们先明确你要实现的效果:输入abcdef要得到aebcdf,本质是把倒数第二个字符(索引为input.Length-2e)移动到第二个位置(索引1),同时把原索引1到input.Length-3的字符依次向后挪一位。

你的代码输出aebbbf,核心问题有两个:

1. 循环方向搞反了

你现在是从索引1开始往后遍历,这样会先把前面的字符覆盖后面的,导致后续移动的都是已经被覆盖的重复值(比如第一次循环就把b写到索引2,第二次循环又把这个b写到索引3,以此类推)。正确的做法应该是从后往前遍历,从倒数第二个位置的前一位开始,往前移动到索引1,这样才不会覆盖还没处理的字符。

2. 循环内重复赋值input[1] = temp

你现在每次循环都把temp(也就是e)写到索引1,但实际上这个赋值只需要在所有字符移动完成后做一次就够了。循环内重复赋值不仅没用,还会在过程中提前把索引1设为e(不过这不是导致重复b的主要原因,但属于多余操作)。


修复后的MethodeX方法

public void MethodeX(char[] input) {
    int lengthText = input.Length;
    // 处理边界情况:如果字符串长度小于3,不需要做任何操作
    if (lengthText < 3) return;
    
    char temp = input[lengthText - 2];
    // 从倒数第二个位置的前一位开始,往前遍历到索引1
    for (int i = lengthText - 3; i >= 1; i--) {
        // 把当前位置的字符后移一位
        input[i + 1] = input[i];
    }
    // 最后把保存的倒数第二个字符放到索引1的位置
    input[1] = temp;
}

验证效果

拿输入abcdef测试一下:

  1. 先保存temp = input[4] = 'e'
  2. 循环i从3到1依次执行:
    • i=3input[4] = input[3] → 数组变成a b c d d f
    • i=2input[3] = input[2] → 数组变成a b c c d f
    • i=1input[2] = input[1] → 数组变成a b b c d f
  3. 最后执行input[1] = temp → 数组变为a e b c d f,也就是你想要的aebcdf

这样就能得到正确结果啦。

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

火山引擎 最新活动