Вставить пробелы в строку по индексу - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь решить эту проблему с Codewars.

Задание

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

Правила

  1. Входная строка всегда будет в нижнем регистре, но может быть пустой.
  2. Если символ в строке является пробелом, тогда передайте его, как если бы это было свободное место. Пример wave ("hello") => ["Hello", "hEllo", "heLlo", "helLo", "hellO"]

Мой код до сих пор хранится в этом repl.it

Мой мыслительный процесс выглядит следующим образом:

  1. Превратить аргумент в массив
  2. манипулировать каждым индексом массива по индексу, а затем перенастроить предыдущий индекс, чтобы сделать волновой паттерн
  3. , превратить массив в строку
  4. , заново вставить пробелы перед записью его в консоль и перезапуском l oop

Я застрял, и мои мысли застряли на том, как использовать

for(var j = 0; j < indexSpaceNumber.length; j++){ //join and add in the spaces at their former index before returning string strToArray[indexSpaceNumber[j]].slice(0, " "); }

для вставки пробелов в строку.

Если есть какие-либо рекомендации или советы, мы будем очень признательны. Я чувствую, что я рядом, но так печально далеко.

Ответы [ 4 ]

2 голосов
/ 31 января 2020

Основная идея будет выглядеть следующим образом:

  1. Перебор символов
  2. Замена символа в исходной строке на заглавную версию

Вы можете использовать Array.from() для преобразования строки в массив и сопоставления каждого элемента с новой строкой. Если символ является пробелом, верните что-то ложное (например, пустая строка). После создания массива отфильтруйте все ложные значения:

const wave = str =>
  Array.from(str, (c,i) => // convert the string to an array
    // replace the character with an uppercase version in the original string
    c === ' ' ?
    ''
    :
    `${str.substring(0, i)}${c.toUpperCase()}${str.substring(i + 1)}`
  ).filter(c => c)

const result = wave("hello") 

console.log(result)
0 голосов
/ 31 января 2020

Я бы go рекурсивный;)

Вы знаете, что для строки длиной n вам нужен массив такой же длины. Это ваше условие выхода.

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

hello []            [Hello]              0: uppercase 1st char and append
hello [Hello]       [Hello hEllo]        1: uppercase 2nd char and append
hello [Hello hEllo] [Hello hEllo heLlo]  2: uppercase 3rd char and append
...

const wave =
  (str, arr = []) =>
    str.length === arr.length
      ? arr
      : wave
          ( str
          , [ ...arr
            ,   str.slice(0, arr.length)
              + str[arr.length].toUpperCase()
              + str.slice(arr.length + 1)
            ]
          );

console.log(wave('hello'));
0 голосов
/ 31 января 2020

Для строки с пробелами

function wave(str) {
  let res = []
  str.toLowerCase().split('').forEach((v, i) => {
    if(v == ' ') return;
    res.push( str.substr(0, i) + v.toUpperCase() + str.substr(i + 1) )
  });
  return res
}

console.log(wave("hello hello"))
0 голосов
/ 31 января 2020

Go на каждый символ в строке и построить Slice str from start till current char + current char to upper case + Slice str from current char to end

const wave = str => {
  const res = [];
  for (let i = 0; i < str.length; i++) {
    res.push(`${str.slice(0, i)}${str[i].toUpperCase()}${str.slice(i + 1)}}`);
  }
  return res;
};

console.log(wave("hi my name is rylan"));

// Alternate way to do with Array.splice
const wave2 = str => {
  const res = [];
  for (let i in str) {
    const temp = Array.from(str);
    temp.splice(i, 1, temp[i].toUpperCase());
    res.push(temp)
  } 
  return res.map(x => x.join(''));
};

console.log(wave2("hi my name is rylan"));
...