You need to enable JavaScript to run this app. C#修正MoveFirst方法:实现数组指定索引元素移到首位
优惠活动
大模型
产品
解决方案
定价
更多

C#修正MoveFirst方法:实现数组指定索引元素移到首位

C#数组移动功能MoveFirst方法逻辑修正

现有实现的核心偏差

你当前的MoveFirst方法采用首位与目标索引元素直接交换的逻辑,完全不符合「将目标索引元素移动到数组首位、其余元素保持相对顺序不变」的需求:交换操作会直接把原首位元素扔到目标索引位置,直接打乱元素间的相对顺序。

结合你给出的示例走一遍错误流程就能直观看到问题:

  • 初始数组:[1,2,3,4,5,6]
  • 第一次执行移动索引1的操作:代码交换位置0和1的元素,结果为[2,1,3,4,5,6]——这一步因为目标索引紧邻首位,结果和正确逻辑碰巧一致
  • 第二次执行移动索引5的操作:代码交换位置0和5的元素,把原本在首位的2直接抛到索引5的位置,最终输出[6,1,3,4,5,2],和预期结果[6,2,1,3,4,5]完全不符。

修正后的MoveFirst实现

正确的移动逻辑需要模拟「摘元素、顺移、塞首位」的操作,保证除了被移到首位的目标元素外,其余元素的前后相对关系完全不变:

public static void MoveFirst(int[] values, int index)
{
    // 边界处理:目标元素本来就在首位,无需操作
    if (index == 0) return;
    // 可选边界校验:防止索引越界
    if (index < 0 || index >= values.Length)
        throw new ArgumentOutOfRangeException(nameof(index), "移动索引超出数组有效范围");
    
    // 1. 暂存目标位置的待移动元素
    int targetValue = values[index];
    // 2. 从目标索引往前推,把区间[0, index-1]的所有元素整体向后顺移1位
    for (int i = index; i > 0; i--)
    {
        values[i] = values[i - 1];
    }
    // 3. 将暂存的目标元素放到数组首位
    values[0] = targetValue;
}

修正效果验证

还是用你给出的测试场景走流程:

  • 初始数组:[1,2,3,4,5,6]
  • 第一次调用移动索引1:暂存值为2,顺移操作把索引0的1移到索引1,最后把2放到索引0,得到数组[2,1,3,4,5,6]
  • 第二次调用移动索引5:暂存值为6,顺移操作依次把索引4的5移到索引5、索引3的4移到索引4、索引2的3移到索引3、索引1的1移到索引2、索引0的2移到索引1,最后把6放到索引0,最终数组为[6,2,1,3,4,5],完全匹配预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 06:54:02