如何将数组指定索引元素移至开头?现有解法求更优方案
更优的数组元素移动实现方式
你的当前实现存在明显缺陷:如果数组中存在重复元素,比如[3,2,3,4],用[3] + ([3,2,3,4] - [3])会得到[3,2,4],而非预期的[3,3,2,4]——因为数组差集操作会移除所有匹配值的元素,而非仅指定索引的那个。
以下是几种更可靠、通用的实现方式(以Ruby为例,其他语言思路类似):
基于切片拼接(不修改原数组)
直接通过索引切片数组,把目标元素放在最前面,再拼接前后部分:arr = [1, 2, 3, 4] target_index = 2 result = [arr[target_index]] + arr[0...target_index] + arr[target_index+1..-1] # 结果:[3, 1, 2, 4]使用slice! + unshift(可选择是否修改原数组)
若允许修改原数组,先取出目标元素再移到开头;不想修改原数组就先复制一份:arr = [1, 2, 3, 4] target_index = 2 new_arr = arr.dup # 复制原数组避免修改原数据 element = new_arr.slice!(target_index) new_arr.unshift(element) # new_arr结果:[3, 1, 2, 4]
如果是JavaScript环境,对应的实现如下:
扩展运算符+切片
const arr = [1, 2, 3, 4]; const targetIndex = 2; const result = [arr[targetIndex], ...arr.slice(0, targetIndex), ...arr.slice(targetIndex + 1)];splice+unshift
const arr = [1, 2, 3, 4]; const targetIndex = 2; const newArr = [...arr]; const element = newArr.splice(targetIndex, 1)[0]; newArr.unshift(element);
这些方法都基于索引操作,不依赖元素唯一性,适用性更广,效率也更稳定(避免了差集操作的额外遍历开销)。
内容的提问来源于stack exchange,提问作者vishless
相关产品推荐
相关产品推荐

