2017-01-25 49 views
1

此方法用於插入元素toAdd作爲數組arr的新第一個元素,將所有當前元素移位以騰出空間。數組原來的最後一個元素將會丟失。該方法沒有返回值,如果該數組沒有元素,它應該沒有效果。瞭解添加到數組方法的邏輯

public static void insert(int[] arr, int toAdd){ 

    if(arr.length > 0) { 

     for(int i = arr.length - 1; i > 0; --i) { 
      arr[i] = arr[i - 1]; 
     } 
     arr[0] = toAdd; 
    } 
} 

我瞭解如果(arr.length> 0)這保證了我們正在以與陣列與至少1個元素的部分。其餘的邏輯混淆了我。爲什麼設置i = arr.length,爲什麼a - 1之後呢?爲什麼我> 0?和我?

謝謝

+0

試着用一個簡單的數組在一張紙上做算法。它會幫助你理解它。 – litelite

+0

如果您想從'i = 0'到'arr.length - 1'執行算法,請在紙上試試:您需要額外的變量,否則會丟失一些信息。向後做循環可以消除這個變量。 –

+0

@ArnaudDenoyelle謝謝,後面的循環是什麼意思? – jun

回答

0

arr.length將返回數組中元素的個數。如果你有一個索引爲0,1和2的元素的數組,它會返回「3」。問題是數組索引是0,所以你需要從長度中減去1來得到數組中最後一個元素的有效索引。 (即3 - 1 = 2和2是最後一個元素的真實索引)

循環使用i > 0,因爲索引i正在由' - i'遞減(即i = i -1)。因此,循環從數組中的最高元素(長度-1)開始,並向下計數到最低(索引0)。

最後,將toAdd分配給0的行應該在for循環之外。

+0

謝謝。如果我明白了,arr.length會每次通過計算每個佔用的索引來生成數組中元素的總數。如果我們有0,3,2,那麼1 + 1 + 1 = 3。現在,由於我們知道數組的總長度,我們可以使用該信息來查找最後一個索引號是什麼。 由於arr.length將其視爲人類將1,2,3,4。而計算機在0,1,2,3,4處計數。然後arr.length總是一個超前一個,所以我們必須從arr.length中刪除一個,以便在計算機計算出正確的最後位置。 – jun

+0

所以arr.length確實給出了正確數量的元素,但arr.length也是有用的,因爲我們可以通過計算計算0,1,2,3,4和arr.length會計算1,2,3,4,因爲1,2,3,4將始終計算正確數量的元素。通過知道arr.length始終處於計算機計數狀態之前,將它用作獲取最後一個索引的工具是非常好的。因此,我們使用通過arr.length確定的信息來獲取正確的最後一個索引的位置編號。 – jun

+0

或者再說一遍,arr.length總是比計算機如何計算索引要少一個。並且知道我們可以減去一個來獲得計算機如何計算索引。 -1就像調整它的一種方式,以便以與計算機相同的方式生成正確的最後索引。 – jun

2

您正在瀏覽您的陣列從它的最後一個元素到第一,而在移動每個元素的一個。例如,當i = 3時,我們將元素2移動到位置3.

但是,此方法不起作用。正確的版本應該是:

public static void insert(int[] arr, int toAdd){ 
    if(arr.length > 0) { 
     for(int i = arr.length - 1; i > 0; i--) { 
      arr[i] = arr[i - 1]; 
     } 
     arr[0] = toAdd; 
    } 
} 

--i減少使用前的i價值,所以應該是i--i應該arr.length開始,否則你不會動的最後一個元素。

+0

arr [i] = arr [i - 1];這幾乎就是說將原始數組分配給每個人,但是返回一步(即 - 1步)。所以每個人的索引都會進行交換/交換,直到數組索引爲0,這就是我們直接將它分入的原因。 – jun

0

爲什麼設置i = arr.length和--i?

它是i = arr.length-1並且這是數組的最後一個索引。您必須開始將元素向後移動(--ii--也可以),否則在將元素移位之前您將覆蓋元素。

爲什麼我> 0?

arr[0] = toAdd;應該在循環之外,並且會失敗arr.length == 0

可以簡化爲:

public static void insert(int[] arr, int toAdd){ 
    if(arr.length > 0) { 
     for(int i = arr.length - 1; i > 0; --i) 
      arr[i] = arr[i - 1]; 
     arr[0] = toAdd; 
    } 
} 
+0

謝謝! 然後在for循環中,假設有6個元素是這樣的: 6 - 1 = 5; 5> 0; 5 - 1 = 4 4 - 1 = 3; 3> 0; 3 - 1 = 2 2 - 1 = 1; 1> 0; 1 - 1 = 0 0 - 1 = -1; -1> 0循環結束? – jun

+0

對不起格式不好 – jun