Для данного массива поверните массив вправо на k шагов, где k неотрицательно.

Пример 1:

Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

Пример 2:

Input: nums = [-1,-100,3,99], k = 2
Output: [3,99,-1,-100]
Explanation: 
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]

Решение:

Во-первых, вам нужно как-то использовать исходный массив для перемещения элементов. так что мы можем поместить каждый элемент в его исходное положение и сдвинуть все элементы вокруг него, чтобы отрегулировать, так как это было бы слишком дорого и, скорее всего, приведет к тайм-ауту на больших входных массивах.

Мы рассмотрим две реализации.

Начнем с нашей первой реализации, которую очень легко понять. В этом подходе мы будем использовать методы массива pop () и unshift (), и нам нужно использовать цикл for для количества раз (количества сдвигов), которое нам нужно сдвинуть номер массива. Итак, нам просто нужно вставить и добавить (не сдвигать) в тот же массив.

var rotate = function (arr, numberOfShifts) {
  let tmp = 0;
  const leng = arr.length;
  numberOfShifts = numberOfShifts % leng;
  for (let i = 0; i < numberOfShifts; i++) {
     tmp = arr.pop();
     arr.unshift(tmp);
  }
 return arr;
};

Вторая реализация более интересна, мы воспользуемся методом массива splice (). Вы, должно быть, думаете, что мы используем метод splice для удаления элементов, верно? но знаете ли вы, что splice () также можно использовать для добавления элементов в массив?

array.splice(start, deleteCount, newElem1, newElem2, ..., newElemN;
  • start обозначает индекс, с которого метод начнет работу с массивом.
  • deleteCount обозначает количество значений, которые должны быть удалены из start. Если значение равно, ничего не будет удалено.
  • newElem1 - newElemN обозначают значения, которые будут добавлены после start.

Давайте углубимся, здесь мы сначала будем использовать метод splice () для получения нового массива (deletedArray) из существующего (arr), что означает, что мы удалили количество элементов, которые мы хотим переместить из исходного массива.

затем будет выполняться цикл количество раз (deletedArray.length), теперь мы будем использовать метод splice () для добавления элементов в исходный массив (arr), где метод splice () будет принимать три аргумента arr.splice (i, 0, deletedArray [ я]).

Пример:

если arr равно [2, 3, 4, 5, 6] и numberOfShifts равно 2,

тогда deletedArray будет [5, 6].

В цикле for
, когда i = 0, arr.splice (0, 0, 5), затем arr = [5, 2, 3, 4]
, когда i = 1, arr.splice (1 , 0, 6), тогда arr = [6, 5, 2, 3, 4]

мы вернем окончательный массив [6, 5, 2, 3, 4].

let rotate = function(arr, numberOfShifts) {
    let deletedArray = arr.splice(arr.length-numberOfShifts);
    for (let i=0; i < deletedArray.length; i++){
        arr.splice(i,0,deletedArray[i]);
    }
    
    return arr;
};

Резюме

  • Первая реализация, мы использовали методы pop () и unshift ().
  • Во второй реализации мы использовали splice (), чтобы получить новый массив deletedArray, а затем с самого начала добавить тот же элемент в исходный массив.

Не забудьте подписаться на публикацию The Lean Programmer Publication, чтобы увидеть больше таких статей, и подпишитесь на нашу новостную рассылку tinyletter.com/TheLeanProgrammer