2017-01-17 241 views
3

好吧,所以我不知道標題是否正確,但我正在努力做的是找到一個算法來做這樣的事情。所以我們有一個輸入數組,例如:['a','b','c','d',...],直到字母表的末尾,以及一個數字。如果我有一個數字3的話,我必須輸出數組['x','y','z','a','b','c',...] 關於如何做的任何想法? 我想:在javascript中向前移位排列

function solve(args) 
{ 
    let arr = ['a', 'b', 'c', 'd']; 
    let number = 3; 

    for (let i = 0; i < arr.length; i++) 
    { 
     if (typeof arr[i + 1] === undefined) 
     { 
      arr[0] = arr[i]; 
     } 
     else if (typeof arr[i - 1] === undefined) 
     { 
      arr[arr.length - 1] = arr[0]; 
     } 
     else 
     { 
      arr[i] = arr[i + 1]; 
     } 
    } 
    console.log(arr); 
} 
+0

的([如何以JavaScript圓形的方式訪問數組]可能的複製http://stackoverflow.com/questions/17483149/how-to-access-array-in-circular -manner-in-javascript) – rlemon

+0

這是旋轉陣列,而不是移動它。 –

回答

6

這幾乎是它除了它打印[d,e,f ... a,b,c]

for(var i = 0; i < number; i++){ 
    arr.push(arr.shift()); 
} 

正如評論指出,這樣做(感謝@dtkaias):結果[x,y,z,a,b,c...]

for(var i = 0; i < number; i++){ 
    arr.unshift(arr.pop()); 
} 

unshift函數將一個元素添加到數組的前面,而pop函數刪除最後一個項目,因此它移動最後一個項目在循環中前面number次。

+0

它不應該流行和不移? –

+3

do'arr.unshift(arr.pop());'改爲 – dtkaias

1

這是將結果複製到新數組的解決方案。時間和空間的複雜性是O(arr.length),如果您正在尋找一個解決方案,使陣列發生變化並具有O(x)時間複雜度,請參閱Patrick的答案。

function rotate(arr, x) { 
 
    return arr.slice(x).concat(arr.slice(0, x)); 
 
} 
 

 
let arr = "abcdefghijkl".split(""); 
 

 
console.log(rotate(arr, -3).join(""));

0

就在2份陣列分開並事後Concat的它們。而已!

arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; 
number = 3; 

xxx = arr.slice(-number); 
yyy = arr.slice(0,arr.length - number); 
arr_shift = xxx.concat(yyy); 

console.log(arr_shift); 
0

Array.prototye.rotate()的發明可能來得到這份工作得心應手。我們來看一個簡單的實現。

Array.prototype.rotate = function(n) { 
 
          var len = this.length; 
 
          return !(n % len) ? this.slice() 
 
              : this.map((e,i,a) => a[(i + (len + n % len)) % len]); 
 
         }; 
 

 
var alpha = Array(26).fill().map((_,i) => String.fromCharCode(i+97)), 
 
rotateLeft = e => (alpha = alpha.rotate(1), alphabet.textContent = alpha.join(",")), 
 
rotateRight = e => (alpha = alpha.rotate(-1), alphabet.textContent = alpha.join(",")); 
 

 
alphabet.textContent = alpha.join(","); 
 
buttonLeft.addEventListener("click",rotateLeft); 
 
buttonRight.addEventListener("click",rotateRight);
<div id="alphabet"></div> 
 
<button id="buttonLeft"><<</button> 
 
<button id="buttonRight">>></button>