簡體   English   中英

在第一個位置插入1D數組中的元素

[英]Inserting an element in a 1D array at the first position

我在Javascript采訪中被問到這個問題,遺憾的是,我當時無法找到比明顯更好的答案:創建一個新數組,為第一個位置分配新值並復制其余部分。

在第一個位置插入1D數組中的元素時,在時間和空間復雜度方面最好的算法是什么?

編輯:沒有內置函數,如unshift()splice()push()和所有函數。

如果任務是簡單地在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。

當數組的開頭或結尾填滿時,創建一個比前一個大兩倍的新數組,並將舊數組的值復制到新數組的中間。

我不知道這是否符合面試問題的限制,但很多面試問題更多的是關於測試你思考問題的能力,以及你對算法的了解,而不是產生一個正確的答案。

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);

小提琴

將元素插入數組@ 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]

jsFiddle例子

在第一個位置插入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值得尊敬的 ,這意味着您將數組中的最后一項視為第一項。 :)

許多人提供的解決方案基本上是“轉移所有東西,然后替換第一個元素”。 也許更好的思考任務的方法是遞歸地“將元素插入pos [0],然后將舊值插入數組其余部分的第一個位置”。

我們可以像這樣迭代地寫它:

function prepend(array, value) {
    for (i = 0; i < array.length; i++) {
        var old = array[i];
        array[i] = value;
        value = old;
    }
}

這個怎么樣:

<script>
var element = 1;
var array = [2, 3, 4, 5];
array = element + array;
alert(array[0]); //Prints 1
</script>

不確定這在背景中的作用是否誠實,但它似乎將元素添加到開頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM