在索引B处插入数字A.

时间:2015-08-20 00:17:25

标签: javascript algorithm

请你帮我解决这个算法而不使用拼接

  

编写一个在索引B处插入新数字A的程序。例如,如果array = [1,3,5,7]且A = 10且B = 2,则在程序结束时,数组应该是[1,3,10,5,7]。

我的想法是我会循环遍历数组,然后将A替换为B,但它不太正确:

for(var i = 0; i < arr.length; i++) {
    arr[2] = 10;
}

2 个答案:

答案 0 :(得分:2)

不使用.splice,您仍有很多选择。现在让我们看一个简单的例子。

此解决方案涉及使用反向循环,并手动调整索引以插入单个值。这会改变原始数组。

你可以在这里看到我们只是将我们的下一个值移动到当前位置,该位置从等于我们长度的索引开始。然后我们可以在最终索引中插入新值。

&#13;
&#13;
function insert (array, index, value) {
  var i = array.length;
  
  while (i > index) {
    array[i] = array[--i]; // Prefix is important.
  }
  
  array[i] = value; // Or array[index], i === index at this point.
  
  return array;
}

console.log(insert([1,2,3,4], 2, 'B'));
&#13;
&#13;
&#13;

这只会将一个元素插入到数组中。你能弄清楚如何从index开始插入多个元素吗?

如果您被允许使用.slice.concat,则可以模拟插入.splice。这将返回一个新数组。

&#13;
&#13;
function insert (array, index, value) {
  return array.slice(0, index).concat(value, array.slice(index));
}

console.log(insert([1,2,3,4], 2, 'B'));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

由于插入会影响数组的长度,因此一种方法是将元素从末尾移动到当前位置+ 1,然后在达到所需索引时插入新元素。

使用递减循环:

function slowSplice(array, element, index) {
  for (var i=array.length; i>index; i--) {
    array[i] = array[i-1];
  }
  array[index] = element;
}

使用递减while循环:

function slowSplice2(array, element, index) {
  var i = array.length;
  while (i > index) {
    array[i] = array[--i];
  }
  array[index] = element;
}

请注意,上面假设一个连续的数组。如果必须容纳稀疏数组,则需要做更多工作。如果要求将函数实现为一般函数,则应遵循splice algorithm from ECMA-262