
本文详解 deleteArrayElements(number, startIndex, everyIth) 函数的正确实现:从起始索引开始取 number 个连续元素(循环寻址),每第 everyIth 个(从子序列首项起计)替换为 null,同时返回处理后数组与被删元素列表。
本文详解 `deletearrayelements(number, startindex, everyith)` 函数的正确实现:从起始索引开始取 `number` 个连续元素(循环寻址),每第 `everyith` 个(从子序列首项起计)替换为 `null`,同时返回处理后数组与被删元素列表。
在实现该函数时,核心误区在于误用 splice() 动态修改原数组——这会导致后续索引偏移、长度变化,且无法保留原始数组结构(题目要求输出数组长度不变,被删位置以 null 占位)。正确的思路是不改变数组长度,仅对满足条件的索引进行映射替换。
关键逻辑解析如下:
-
“取前
number个元素”并非截取子数组,而是定义一个逻辑区间:从startIndex开始,按循环方式(即模数组长度)连续计数number次; -
“每第
everyIth个”指该逻辑区间的相对位置:即(当前全局索引 - startIndex) % everyIth === 0; -
必须支持循环寻址:当
startIndex超出数组长度时,应通过i % array.length回绕;同理,遍历过程中所有索引均需取模,确保不越界; -
返回数组长度必须与原数组一致,被删位置统一设为
null,而非物理删除。
以下是符合全部要求的专业实现:
function deleteArrayElements(number, startIndex, everyIth) {
const array = ["hund", "katze", "maus", "elefant", "schlange", "stachelschwein", "affe", "giraffe"];
const removedItems = [];
const result = array.map((element, globalIndex) => {
// 计算该 globalIndex 在逻辑区间中的相对位置(从 0 开始)
const offset = (globalIndex - startIndex + array.length * 10) % array.length; // 防负数取模
const isInRange = offset <p>✅ 正确处理边界情况:</p>
-
deleteArrayElements(6, 0, 2)→ 删除索引0, 2, 4(即"hund","maus","schlange"),结果中对应位置为null; -
deleteArrayElements(5, 7, 13)→startIndex=7已在末尾,number=5循环覆盖索引7,0,1,2,3;因everyIth=13 > 5,仅删除首个(offset=0),即索引7处的"giraffe"。
⚠️ 注意事项:
- 原题示例中
array是固定测试数据,实际使用时建议将数组作为参数传入,提升函数通用性; -
offset计算需规避负数取模问题,推荐写法:(globalIndex - startIndex + array.length * 10) % array.length或使用((globalIndex - startIndex) % array.length + array.length) % array.length; -
everyIth可能大于number或数组长度,此时仅触发一次删除(offset === 0),符合“至少删除第 0 个”的要求。
该方案时间复杂度 O(n),空间复杂度 O(n),语义清晰、无副作用、完全满足题设所有约束。










