基于shiftAmounts数组移动固定4元素数组元素的JavaScript需求
固定长度数组的原地右移处理(从右到左操作)
问题核心
- 数组
arr固定长度为4,不能增删元素总数,移位超出数组范围的元素直接丢弃,空位用"Empty"填充 - 必须从右到左(即从最后一个元素开始,索引从3到0)依次处理每个元素的移位
- 元素移位后不能交叉,所有操作需在原数组上完成(原地操作)
示例分析
原数组:[A, B, C, D],移位数组:[0, 1, 1, 3]
处理顺序为D → C → B → A:
- D(索引3)右移3位,目标位置
3+3=6超出数组最大索引3,直接丢弃,原位置设为"Empty" - C(索引2)右移1位,目标位置
2+1=3为空,移动后数组变为[A, B, "Empty", C] - B(索引1)右移1位,目标位置
1+1=2为空,移动后数组变为[A, "Empty", B, C] - 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
相关产品推荐
相关产品推荐

