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
相关产品推荐
相关产品推荐

