2016-12-29 33 views
1

我通過Marijn Haverbeke雄辯的JavaScript演習工作的陣列和我工作的以下問題:能言善辯的JavaScript倒車到位的解釋

「寫一個函數reverseArrayInPlace修飾作爲參數給出的數組以扭轉其元素不要使用標準reverse方法」

給出的解決方案如下:

function reverseArrayInPlace(array) { 
    for (var i = 0; i < Math.floor(array.length/2); i++) { 
     var old = array[i]; 
     array[i] = array[array.length - 1 - i]; 
     array[array.length - 1 - i] = old; 
    } 
    return array; 
} 

給出的測試情況如下:

var arrayValue = [1, 2, 3, 4, 5]; 
reverseArrayInPlace(arrayValue); 
console.log(arrayValue); 
// → [5, 4, 3, 2, 1] 

我所知,這是使用數組作爲旋轉點的中點,但有人可以請給我一步步的解釋?

+0

所有你需要知道的是['Math.floor()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor), [for'循環](https://developer.mozilla.org/tr/docs/Web/JavaScript/Reference/Statements/for)和['array.length'](https://developer.mozilla.org/tr/docs/Web/JavaScript/Reference/Global_Objects/Array/length),其餘部分就像一個僞代碼。順便說一句,你總是可以使用array中的['Array.prototype.reverse()'](https://developer.mozilla.org/tr/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)來顛倒數組。方法。 – Redu

+0

可能的重複[如何在Java中反轉int數組?](http://stackoverflow.com/questions/2137755/how-do-i-reverse-an-int-array-in-java) – Jmills

回答

1

服用逐行:

for (var i = 0; i < Math.floor(array.length/2); i++) { 

將數組從0循環到數組的一半(四捨五入爲較小數字),增加i by每次一個。

var old = array[i]; 

temporarely存儲在位置i在可變old陣列的當前值。

array[i] = array[array.length - 1 - i]; 

設置i位置到陣列減去當前i的最後一個元素的值的值。

array[array.length - 1 - i] = old; 

將數組減去當前i爲先前的值(存儲在old變量)的最後一個元素的值。

概括地說,這裏是正在發生的事情實際情況:

old將存儲當前循環值。這個值將被替換爲當前索引的最後一個值MINUS。基本上,當i0時,array[0]變成array[4],反之亦然。當i爲1時,array[1]將變爲array[3],反之亦然。[array.length - 1 - i]是必需的,因爲數組中的索引從0開始,因此array.length - 1是數組的最後一個元素,而-i將偏移量移動i,這使得可以將第一個元素的值與最後一個元素切換,反之亦然。

那麼交易的地方在哪裏,而不是定期的循環?

那麼,訣竅是它將花費一半的時間,並將一次替換兩個值,而不是循環整個數組,並一次替換一個值。

2
function reverseArrayInPlace(array) { 
    //iterate thru half of original array 
    for (var i = 0; i < Math.floor(array.length/2); i++) { 
    var old = array[i]; //cache original i value 
    array[i] = array[array.length - 1 - i]; //set i value to its "opposite" from end of array 
    array[array.length - 1 - i] = old; //set "opposite" to be original i value 
    } 
    return array; 
} 

當您遍歷數組的1/2時,交換距陣列前端和末端距離相等的2個值。例如:

原始數組:[1, 2, 3, 4, 5]

步驟1 = 0:[5, 2, 3, 4, 1](1和5被交換)

步驟1 = 1:[5, 4, 3, 2, 1](2和4被交換)