2016-05-28 53 views
1

我最近開始從Eloquent Javascript學習Javascript,直到數據結構的方式。爲什麼這個Javascript函數不能反轉數組?

有一個編碼練習如下

寫兩個功能,reverseArray和reverseArrayInPlace。第一個reverseArray將一個數組作爲參數,並生成一個具有相反元素的新數組。第二個reverseArrayInPlace函數完成reverse方法的作用:它修改給定的數組作爲參數,以便反轉它的元素。既不可以使用標準的反向方法。

這裏是我的代碼

/* 
 
* Create a Function reverseArray which returns a new array with the reversed array 
 
* Create another Function reverseArrayInPlace() which modifies the ORiginal Array . 
 
*/ 
 

 
function reverseArray(array) { 
 
    var reversed = []; 
 
    for (var i = 0; i < array.length; ++i) { 
 
    reversed[i] = array[array.length - (i + 1)]; 
 
    } 
 
    return reversed; 
 
} 
 

 
function reverseArrayInPlace(array) { 
 
    var temp = 0; 
 
    for (var i = 0; i < array.length; ++i) { 
 
     temp = array[i]; 
 
     array[i] = array[array.length - (i + 1)]; 
 
     array[array.length - (i + 1)] = temp; 
 
    } 
 
    } 
 
    // Test Case 
 
var ar = [10, 9, 8, 7, 6]; 
 
console.log(reverseArray(ar)); 
 

 
// Reverse the Array 
 
reverseArrayInPlace(ar); 
 
console.log(ar);

的reverseArray()函數它的工作做好,返回反陣,但reverseArrayInPlace()不工作。

我做錯了什麼?

回答

3

您正在翻轉兩次。與array.length/2

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

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

 
var ar = [10, 9, 8, 7, 6]; 
 

 
console.log(reverseArrayInPlace(ar));

的邏輯並不正確更換array.length,並且不返回任何結果

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

var ar = [10, 9, 8, 7, 6]; 

console.log(reverseArrayInPlace(ar)); 
+0

規範聲明不返回任何內容,然後更改數組。 –

+0

對不起,我編輯它 – CoolLife

+0

如果你想你不需要返回,但你可以取代控制檯的回報。日誌(陣列)和它的工作 – CoolLife

1

阿倫的回答顯示了適當的代碼去做你正在尋找的東西。

爲什麼你的代碼沒有按預期工作的答案是因爲你在整個數組中循環,交換每個變量與它的鏡像。一旦你已經走過去的一半,不過,你的代碼行被設置鏡像:

array[array.length - (i + 1)] 

的交換陣列回原來的順序。

添加此行只是你temp = array[i];行之後:

console.log('Swapping ' + array[i] + ' with ' + array[array.length - (i+1)]); 

現在當你運行你的代碼,你應該立即明白你爲什麼要停在中途點。

你應該看到:

Swapping 10 with 6 
Swapping 9 with 7 
Swapping 8 with 8 
Swapping 9 with 7 
Swapping 10 with 6 

現在,隨着阿倫的代碼運行,你會看到:

Swapping 10 with 6 
Swapping 9 with 7 
Swapping 8 with 8 
[ 6, 7, 8, 9, 10 ] 

有意義嗎?

+1

你每天都會學習一些新東西,甚至從這些失誤中學習。 :D –

+0

我已經編程了近20年,並不斷學習新東西。 –

相關問題