Обратная строка в чередующихся кусках размера k - PullRequest
2 голосов
/ 30 марта 2020

Учитывая строку и целое число k, вам нужно поменять местами первые k символов для каждого сегмента длиной 2k символов, считая от начала строки. Если осталось менее k символов, поменяйте их местами. Если количество символов меньше 2k, но больше или равно k, то сначала измените первые k символов и оставьте остальные как исходные.

Пример

Input:  s = "abcdefg", k = 2
Output: "bacdfeg"

В приведенном выше примере первый кусок из двух "ab" был обращен к "ba", а третий кусок из двух "ef" был обращен к "fe".

Это мой подход:

var reverseStr = function(s, k) {
  for (let i = 0; i < k; i++) {
    let temp = s[i];
    s[i] = s[k - i - 1];
    s[k - i - 1] = temp
  }
  return s
};

console.log(reverseStr("abcdefg", 2))

Как мне получить желаемый результат?

Ответы [ 4 ]

4 голосов
/ 30 марта 2020

Строки в JavaScript являются неизменными, вы не можете присвоить их индексам, чтобы изменить строку на месте. Вам нужно построить новую строку и вернуть ее.

Вам нужно al oop для каждой группы 2k. Извлеките эту подстроку, поменяйте местами первые k символы, затем объедините их с результатом.

function reverseStr(s, k) {
  let result = "";
  for (let i = 0; i < s.length; i += 2*k) {
    let chunk1 = s.substr(i, k);
    // reverse first half
    chunk1 = chunk1.split("").reverse().join("");
    let chunk2 = s.substr(i+k, k);
    result += chunk1 + chunk2;
  }
  return result;
}

console.log(reverseStr("12345678", 2));
4 голосов
/ 30 марта 2020

Один из вариантов - использовать регулярное выражение для сопоставления до k символов, затем до 2k символов - затем использовать функцию замены, чтобы обратить только начальные k символы:

var reverseStr = function(s, k) {
  const pattern = new RegExp(`(.{1,${k}})(.{0,${k}})`, 'g');
  return s.replace(pattern, (_, g1, g2) => [...g1].reverse().join('') + g2);
};

console.log(reverseStr("abcdefg", 2))
0 голосов
/ 30 марта 2020

Вы можете реализовать это в три этапа. Сначала разделите строку на группу k. Затем переверните строку каждой группы по четному индексу. Последний присоединиться ко всей группе вместе.

   function reverseStr(s, k) {
    return s
      .replace(new RegExp('\\w{' + k + '}', 'g'), $2 => $2 + '|')
      .split('|')
      .map((item, i) =>
        i % 2 !== 0
          ? item
          : item
              .split('')
              .reverse()
              .join('')
      )
      .join('');
  }

  console.log(reverseStr('abcdefg', 2));
0 голосов
/ 30 марта 2020

Обратная строка в кусках размером k

//make a variable string with some letters to test.
let str = "abcdefg"; 

//k represents is the number of letters to reverse starting at 0 to position k
let k = 4;  

//select the first k letters and split on blankstring, converting to a list 
//then reversing that list, collapsing it to a string with join, then 
//re-append the original string at position k to the end. 
result = (str.substring(0,k).split('')).reverse().join('') + str.substring(k); 
console.log({result}); 

Отпечатки:

{ result: 'dcbaefg' } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...