@Quintis

Как ускорить while loop?

Написал функцию для прохождения задания - https://www.codewars.com/kata/55c04b4cc56a697bb000...
но не могу пройти так как выбивает ошибка Execution Timed Out (12000 ms)
Как ускорить while loop ?
function scramble(str1, str2) {
  let finishSTR = str2.split("").filter(el=>{return el.match(/[a-z]/)});
  let startSTR = str1.split("").filter(el=>{return el.match(/[a-z]/)});
  let result = true;
  let len = finishSTR.length;
  while (len--) {
    console.log(len);
    let el = finishSTR[len]
    if (startSTR.includes(el)){
      startSTR[startSTR.indexOf(el)] = null
    } else {
      result= false
      return false
    }
  }

  console.log(result);
  return result;
  //code me
}
scramble("rkqodlw", "world");
  • Вопрос задан
  • 500 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
includes() и indexOf() каждый раз, считайте, пробегают, в среднем, по полстроки.
Представьте, что там дико длинные строки, гигабайтные.
Поэтому алгоритм желательно построить так, чтобы по каждой Войне и Миру пройтись 1 раз или меньше.

Условие хорошо сужает возможные символы до всего 26 букв латинского алфавита a..z

Рабочее решение под
спойлером

Например, можно создать массив из 26 счётчиков и заполнять их из первой строки и опустошать из второй.
Вот такое моё решение прошло тест:
function scramble(str1, str2) {
  if (str1.length < str2.length) return false;
  const a = Array(26).fill(0);
  for (let c of str1) a[c.charCodeAt(0) - 97]++;
  for (let c of str2) a[c.charCodeAt(0) - 97]--;
  for (let n of a) if (n < 0) return false;
  return true;
}
* 97 это ASCII-код маленькой латинской "a"
Ответ написан
Комментировать
@galaxy
sort -> join и потом тупо сравнить две строки, безо всяких циклов
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы