Сдвиги круглые влево и вправо - PullRequest
0 голосов
/ 14 марта 2019

На Хакерранке я столкнулся с этой проблемой.У меня есть функция, которая принимает 3 аргумента.Пример -> function shiftStrings ("string", leftShifts, rightShifts);LeftShifts и rightShift являются целыми числами.

Сдвиг влево: одиночное круговое вращение строки, в котором первый символ становится последним символом, а все остальные символы сдвигаются на один индекс влево.Например, abcde становится bcdea после одного сдвига влево и cdeab после двух сдвигов влево.

Сдвиг вправо: одиночное круговое вращение строки, в котором последний символ становится первым символом, а все остальные символы сдвигаются вправо.Например, abcde становится eabcd после одного сдвига вправо и deabc после двух сдвигов вправо.

Я прошел 7 из 13 тестовых случаев, но остальные пять были истекли.Вот мое решение

function getShiftedString(s, leftShifts, rightShifts) {
// Write your code here
let arr = s.split('');

for (let i = 0; i < leftShifts; i++) {
    let arrItem = arr[0];
    arr.shift();
    arr.push(arrItem);
};

for (let i = 0; i < rightShifts; i++) {
    let arrItem = arr[arr.length - 1];
    arr.pop();
    arr.unshift(arrItem);
};

const finished = arr.join('');
return finished;

}

Есть идеи о лучшем способе сделать это?Я новичок в программировании и пытаюсь освоить алгоритм.

Ответы [ 2 ]

3 голосов
/ 14 марта 2019

Вероятно, было бы проще использовать slice (который может принимать отрицательные значения) и первоначально рассчитать чистый сдвиг, так что требуется только одна фактическая операция сдвига:

function getShiftedString(s, leftShifts, rightShifts) {
 // using `split('')` will result in certain unicode characters being separated incorrectly
 // use Array.from instead:
  const arr = Array.from(s);
  const netLeftShifts = (leftShifts - rightShifts) % arr.length;
  return [...arr.slice(netLeftShifts), ...arr.slice(0, netLeftShifts)]
    .join('');
}

console.log([
  getShiftedString('abc', 0, 0),
  getShiftedString('abc', 1, 0),
  getShiftedString('abc', 0, 1),
  getShiftedString('abc', 1, 1),
  getShiftedString('123456789', 0, 0),
  getShiftedString('123456789', 1, 5),
  getShiftedString('123456789', 5, 1),
  '----',
  getShiftedString('123456789', 9, 0),
  getShiftedString('123456789', 10, 0),
  getShiftedString('123456789', 0, 9),
  getShiftedString('123456789', 0, 10),
  getShiftedString("??❤", 0, 0),
  getShiftedString("??❤", 1, 0),
]);
0 голосов
/ 14 марта 2019

Вот мое решение для сдвига влево и вправо с использованием оператора сплайсинга и спреда.

   //left
let str="abcde";
let arr=Array.from(str);
let left_shift=2;
let x=arr.splice(0, left_shift);
console.log([...arr,x].flat().join(""));

//right

let arr1=Array.from(str).reverse();
let right_shift=2;
let x1=arr1.splice(0, right_shift);
console.log([...arr1,x1].flat().reverse().join(""));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...