2017-01-17 201 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>