2017-08-31 15 views
3

我試圖解決以下鍛鍊的數組:倒車無「反向」或複製的陣列

逆向陣列時不使用反向的方法,而不使用 第二陣列,並且在不復制任何的價值。

我想過把數組做成一個對象,然後將數組從最後更新到開始,但我想你也可以更新它。

嘗試一些簡單的像:

function reverseArray(array) { 
 
    for (var i = 0; i < array.length; i++) { 
 
    // var elem = array.shift(); 
 
    var elem = array.shift() 
 
    array.push(elem) 
 
    } 
 
    return array 
 
} 
 

 
array = ['a', 'b','c','d','e']; 
 

 
reverseArray(array);

但是,這並沒有真正改變。有關如何做到這一點的任何建議或解釋?

+0

我會去了解一下這個職位它是Java,但概念應該仍然工作。 https://stackoverflow.com/questions/5985365/how-to-reverse-a-list-with-o1-space-and-on-time –

+1

*「沒有重複」*:這個要求是什麼意思?你不允許獲取數組值的副本? – trincot

+1

我仍然希望OP解釋「沒有重複」是什麼意思...... – trincot

回答

7

隨着ES6語法,你並不需要的值複製到一個臨時變量(是什麼最後的要求是什麼?)。

function reverse(arr) { 
 
    for(let i = 0, j = arr.length-1; i < j; i++, j--) 
 
     [arr[i], arr[j]] = [arr[j], arr[i]]; 
 
} 
 

 
const arr = ['a','b','c','d','e']; 
 
reverse(arr); 
 
console.log(arr);

可能有人會認爲陣列這裏創建(如果引擎不優化送人),就像splice還創建了一個數組(如它的返回值)。

2

下面的方法可以在不使用reverse方法的情況下反轉數組。它通過交換第一個和最後一個元素,然後交換第二個和倒數第二個元素,然後第三個和倒數第三個元素等,直到i不再比(<)小於j

function reverse(arr) { 
 
    for(var i = 0, j = arr.length-1; i < j; i++, j--) { 
 
    var tmp = arr[i]; 
 
    arr[i] = arr[j]; 
 
    arr[j] = tmp; 
 
    } 
 
    return arr; 
 
}; 
 

 
var reversed = reverse(['a','b','c','d','e']); 
 
console.log(reversed);

+1

這項工作通過交換第一個和最後的元素,然後是第二個和倒數第二個元素,然後是第三個和倒數第三個元素等。 –

1

https://jsfiddle.net/pa2fqa8n/1/

a = ['a', 'b', 'c', 'd', 'e']; 
for(var i = 0; i < a.length-1; i++){ 
    for(var j = 0; j < a.length-i-1; j++){ 
    var k = a[j]; 
    a[j] = a[j+1]; 
    a[j+1] = k; 
    } 
} 

內環的第一次迭代移動到端部的第一元件,並且這些元件的其餘部分向前一次。接下來的每次迭代都會執行相同的操作,但比以前的迭代少1次。

+0

已添加說明,但我個人更喜歡jsfiddle。 – lancew

1

這裏是如何,沒有副本,臨時數組或變量保存值,或使用Array.reverse() .Modifying數組中的地方

function reverseArray(array) { 
 
    var len = array.length; 
 
    for (var i=len,j=-1; j++,i--;) array.unshift(array[len-1-i+(j)]); 
 
    array.length = len; 
 
} 
 

 
var array = ['a', 'b','c','d','e']; 
 

 
reverseArray(array); 
 
console.log(array);

,它把值倒退到的開始數組,將舊值推到末尾,然後在迭代完成後通過重置數組的長度對它們進行分片。

+0

雖然這複製了數組中的所有元素。另外,追加而不是預先更有效率? – Dukeling

+0

@Dukeling - 任何解決方案都會「複製」這些元素,讓他們感動的是什麼。如果我追加值,我必須切片數組,這將創建一個新的數組,使用'length'切割數組只能在新值開始時才起作用。 – adeneo

+0

這需要O(n)額外的空間,通過複製數組中的每個元素(在我看來,這顯然違反了「不重複任何值」),其中 - 作爲[this](https://stackoverflow.com/a/45989220/1711796),例如,似乎(基於我有限的JS知識)只需要O(1)額外的空間。 – Dukeling

0

我不得不使用交換變量,這違反了「沒有重複任何值」?

var test1 = [2, '5', 6, 'a', 'Z']; 
 
var test2 = [2, '5', false, 'a', 'Z', {a: 'whatevs'}]; 
 

 
console.log('test1 before', JSON.stringify(test1)); 
 
console.log('test2 before', JSON.stringify(test2)); 
 

 
reversarooni(test1); 
 
reversarooni(test2); 
 

 
console.log('test1 after', JSON.stringify(test1)); 
 
console.log('test2 after', JSON.stringify(test2)); 
 

 
function reversarooni(inputArray) { 
 
    var index = 0; 
 
    var len = inputArray.length; 
 
    
 
    for(; index < len/2; index++) { 
 
    var swap = inputArray[index]; 
 
    inputArray[index] = inputArray[(len - 1) - index]; 
 
    inputArray[(len - 1) - index] = swap; 
 
    } 
 
}

3

array = ['a', 'b', 'c', 'd', 'e']; 
 
console.log(array); 
 

 
for (var i = 0; i < Math.floor(array.length/2); i++) { 
 
    var item = array[i]; 
 
    array[i] = array[array.length - i - 1]; 
 
    array[array.length - i - 1] = item; 
 
} 
 
console.log(array);

+2

恭喜......你是唯一一個想到的人,只走了一半。 – Redu

+0

@Reed,PaulFitzgerald已經提前15分鐘了。 – trincot

+1

@trincot你是對的..也很榮幸他:) – Redu

1

這裏是一個最小的方法。鑑於var arr = [1,2,3,4],這個循環就會發生變異arr[4,3,2,1]

for (var i = 0; i < arr.length - 1; i++) { 
    arr.splice(i, 0, arr.pop()); 
} 
0

您可以使用spread syntax ...rest parameters ...並使用遞歸和功能方法返回交換項目。

const 
 
    _ = (...a) => a, 
 
    rev = (a, ...rest) => rest.length ? _(...rev(...rest), a) : _(a), 
 
    reverseArray = array => rev(...array); 
 

 
console.log(reverseArray(['a', 'b', 'c', 'd', 'e'])); 
 
console.log(reverseArray(['a'])); 
 
console.log(reverseArray(['a', 'b']));
.as-console-wrapper { max-height: 100% !important; top: 0; }