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

基于shiftAmounts数组移动固定4元素数组元素的JavaScript需求

固定长度数组的原地右移处理(从右到左操作)

问题核心

  • 数组arr固定长度为4,不能增删元素总数,移位超出数组范围的元素直接丢弃,空位用"Empty"填充
  • 必须从右到左(即从最后一个元素开始,索引从3到0)依次处理每个元素的移位
  • 元素移位后不能交叉,所有操作需在原数组上完成(原地操作)

示例分析

原数组:[A, B, C, D],移位数组:[0, 1, 1, 3]
处理顺序为D → C → B → A:

  1. D(索引3)右移3位,目标位置3+3=6超出数组最大索引3,直接丢弃,原位置设为"Empty"
  2. C(索引2)右移1位,目标位置2+1=3为空,移动后数组变为[A, B, "Empty", C]
  3. B(索引1)右移1位,目标位置1+1=2为空,移动后数组变为[A, "Empty", B, C]
  4. A(索引0)移位量为0,保持不动,最终结果为[A, "Empty", B, C]

实现思路(JavaScript为例)

核心是从右到左遍历,确保先处理右侧元素,避免左侧元素移位时覆盖未处理的右侧元素。对每个元素计算目标位置:

  • 若目标位置在数组范围内,将元素移至目标位置,原位置设为"Empty"
  • 若目标位置超出数组范围,直接将原位置设为"Empty"

代码实现

function processFixedShift(arr, shiftAmounts) {
    // 从右到左遍历数组索引(3 → 0)
    for (let i = arr.length - 1; i >= 0; i--) {
        const shift = shiftAmounts[i];
        const targetIndex = i + shift;
        
        if (targetIndex < arr.length) {
            // 目标位置有效,移动元素
            arr[targetIndex] = arr[i];
            // 原位置与目标位置不同时,标记为空
            if (i !== targetIndex) {
                arr[i] = "Empty";
            }
        } else {
            // 超出范围,原位置标记为空
            arr[i] = "Empty";
        }
    }
    return arr;
}

// 测试示例
const originalArr = ['A', 'B', 'C', 'D'];
const shiftAmounts = [0, 1, 1, 3];
processFixedShift(originalArr, shiftAmounts);
console.log(originalArr); // 输出: ['A', 'Empty', 'B', 'C']

关键注意事项

  • 必须严格按从右到左的顺序处理,否则会出现元素被意外覆盖的情况
  • 操作完全基于原数组,没有创建新数组,符合原地操作要求
  • 固定长度限制下,超出范围的元素直接丢弃,无需额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:23:23