2017-01-17 15 views
3

Хорошо, поэтому я не знаю, правилен ли заголовок или нет, но я изо всех сил стараюсь найти алгоритм, чтобы сделать что-то вроде этого. Таким образом, у нас есть входной массив, такой как: ['a', 'b', 'c', 'd', ...] до конца алфавита и число, которое нужно сдвинуть. Я должен выводить массив как ['x', 'y', 'z', 'a', 'b', 'c', ...], если мне нужно сдвинуть число 3; Любые идеи о том, как это сделать? Я пробовал:Переместить массив вперед в 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()); 
} 

The Функция unshift добавляет элемент к фронту массива, а функция pop удаляет последний элемент, поэтому он перемещается последний элемент спереди number раз в цикле.

+0

Должен ли он быть поп и не переключаться? –

+3

do' arr.unshift (arr.pop()); вместо этого – dtkaias

1

Это решение, которое копирует результат в новый массив. Сложность времени и пространства - O(arr.length), если вы ищете решение, которое мутирует массив на месте и имеет временную сложность O(x), то см. Ответ Патрика.

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>

Смежные вопросы