2017-01-17 4 views
3

タイトルが正しいかどうかわかりませんが、私がやっていることは、このようなことをするアルゴリズムを見つけることです。したがって、アルファベットの終わりまでの['a'、 'b'、 'c'、 'd'、...]、およびシフトする数字のような入力配列があります。私はシフトするために3番目の番号を持っているなら、['x'、 'y'、 'z'、 'a'、 'b'、 'c' ...]のような配列を出力する必要があります。 それを行う方法に関するアイデアはありますか? 私が試した:[x,y,z,a,b,c...]シフト配列をjavascriptで前方に移動する

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

での結果:それは[d,e,f ... a,b,c]

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

としては、この(感謝@dtkaias)を行い、コメントで指摘印刷さ以外

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

これは、配列をシフトしないで* rotate *しています。 –

答えて

6

これはほとんどそれでありますunshift関数は配列の先頭に要素を追加しますが、pop関数は最後の要素を削除して移動します前の最後の項目はループ内のnumber回です。

+0

ポップで不安定ではありませんか? –

+3

'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>

関連する問題