我在Javascript
采访中被问到这个问题,遗憾的是,我当时无法得到比当时显而易见的答案更好的答案:创建新阵列,为第一个位置分配新值并复制其余部分。
在第一个位置的1D数组中插入元素时,在时间和空间复杂度方面最好的算法是什么?
编辑:不使用unshift()
,splice()
,push()
等所有内置函数。
答案 0 :(得分:4)
如果任务是简单地在vanilla 1D数组的头部插入一个元素,那么我认为你唯一的选择就是这种O(N)方法:
for(var i = ary.length; i > 0; i--) {
ary[i] = ary[i - 1];
}
ary[0] = value;
如果目标是优化在数组开头插入元素的操作(如同需要那样做很多操作),你可以做的是创建一个数组结构来维护一个空的数组开头和结尾的空格,以及第一个和最后一个填充项目的位置:
_ _ b d f a _ _
0 1 2 3 4 5 6 7
这允许您在O(1)摊销时间内插入和删除数据结构开头和结尾的项目,只需更新开始或结束的索引并将值插入下一个空位置,尽管最坏情况下的空间使用量是2N。
当数组的开头或结尾填满时,创建一个比前一个大两倍的新数组,并将旧数组的值复制到新数组的中间。
我不知道这是否符合你的面试问题的限制,但很多面试问题更多的是关于测试你思考问题的能力,以及你对算法的了解,而不是关于产生一个正确的答案
答案 1 :(得分:3)
var myArr = [0, 1, 2];
function spliceToStart (value, inArray) {
for (count = inArray.length; count > 0; count--) {
inArray[count] = inArray[count-1];
}
inArray[0] = value;
};
spliceToStart('Value', myArr);
console.log(myArr);
答案 2 :(得分:2)
将元素插入数组@ position 0的功能方法:
(function (val) {
var i = this.length;
while (i--){ this[i+1] = this[i]; };
this[0] = val;
}).call([1,2,3,4], 0); //=> [0,1,2,3,4]
另一个(稍快)
(function (val) {
this.reverse()[this.length] = val;
return this.reverse();
}).call([1,2,3,4], 0); //=> [0,1,2,3,4]
答案 3 :(得分:1)
在第一个位置的1D数组中插入元素时,在时间和空间复杂度方面最好的算法是什么?
有序 - O(n)
for(var i=0; i<arr.length; i++)
arr[i+1] = arr[i];
arr[0] = value;
无序 - O(1)
arr[arr.length] = arr[0];
arr[0] = value;
订购 - O(1)
arr[arr.length] = value;
// access ith item
arr[(arr.length-i-1)]
// print all items in order
for (int i=0; i<arr.length; i++)
console.log( arr [ (arr.length-i-1) ] );
在此示例中,数组arr
被尊重,这意味着您将数组中的最后一项视为第一项。 :)
答案 4 :(得分:0)
许多人提供的解决方案基本上是“转移一切,然后替换第一个元素”。也许更好的思考任务的方法是递归地“在pos [0]处插入元素,然后将旧值插入到数组其余部分的第一个位置”。
我们可以像这样迭代地写它:
function prepend(array, value) {
for (i = 0; i < array.length; i++) {
var old = array[i];
array[i] = value;
value = old;
}
}
答案 5 :(得分:-2)
这个怎么样:
<script>
var element = 1;
var array = [2, 3, 4, 5];
array = element + array;
alert(array[0]); //Prints 1
</script>
不确定这在背景中的作用是否诚实,但它似乎将元素添加到开头。