Повторять строку бесконечно - возвращать количество определенных символов в пределах длины N бесконечной строки - JavaScript - PullRequest
1 голос
/ 11 июля 2019

Пытаясь решить эту проблему HackerRank :

У Лайлы есть строка s строчных английских букв, которые она повторяла бесконечно много раз.

Учитывая целое число, n , найдите и напечатайте число букв а в первых буквах бесконечной строки Лайлы.

Например, если строка s= abcac и n = 10 , подстрока, которую мы рассматриваем, является abcacabcac , первые 10 символов ее бесконечной строки.В подстроке есть 4 вхождений "a".

Я написал:

function repeatedString(s, n) {

    s = s.repeat(n);
    s = s.slice(0, n);
    
    let array = Array.from(s);
    let count = 0;
    for (let i = 0; i < array.length; i++) {
        let char = array[i];
        if (char.match(/[a]/gi)) {
            count++;
        }
    }
    return count;
}
console.log(repeatedString("abcac", 10)); 

Но HackerRank не любит s = s.repeat(n);, видимо:

enter image description here

Яне уверен, как еще генерировать строку подходящей длины для нарезки.s = s.repeat(Infinity) не работает, а s - это , а не повторяется бесконечное число раз, когда оно передается в качестве параметра.

Т.е. console.logging, изначально, logs

abcac

В этом случае.

Я также пробовал:

function repeatedString(s, n) {

  let j = n;
  let newString = "";
  while (n > 0) {
      newString += s;
      n--;
  }
  
  newString = newString.slice(0, j);
  let count = 0;
  let array = Array.from(newString);
 
  for (let i = 0; i < array.length; i++) {
      let char = array[i];
      if (char.match(/[a]/gi)) {
          count++;
      }
  }
  return count;
}
console.log(repeatedString("abcac", 10)); 

Но это вызвало ошибку тайм-аута.

Любые другие идеи о том, как создать строку допустимой длины для нарезки?

РЕДАКТИРОВАТЬ :

Ограничения:

1 <= | s |<= 100 </p>

1 <= n <= 10 ^ 12 </p>

Для 25% тестовых случаев, n <= 10 ^ 6 </strong>

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

повторение строки n раз - огромная трата памяти и времени выполнения.

просто вычислите, как часто вся строка будет повторяться, сколько раз a s строка плюс число a s в части s.slice(0, n%s.length)

А время выполнения уменьшается до s.length вместо n

function repeatedString(s, n) {
  var r = n % s.length,
    m = (n - r) / s.length,
    count = 0;

  for (var i = 0; i < s.length; ++i) {
    if (s[i] === "a") {
      count += m + (i < r);
    }
  }
  return count;
}

console.log(repeatedString("abcac", 1234567890));
1 голос
/ 11 июля 2019

Я проверил это и знаю, что это работает.По сути, я не создаю новую строку, я просто выясняю, сколько раз мне нужно умножить исходную строку, чтобы иметь возможность ее обрезать.Затем я умножаю это число на количество «а» в исходной строке.

function repeatedString(s, n) {

    var charLength = s.length;
    var repeat = Math.floor(n/charLength);
    var remainder = n%(charLength);
    var strCut = s.slice(0, remainder);
    
    let count = 0;
    let arrayX = Array.from(s);
    for (let i = 0; i < arrayX.length; i++) {
        let char = arrayX[i];
        if (char.match(/[a]/gi)) {
            count++;
        }
    }
    
    count = count * repeat;
    
    let arrayY = Array.from(strCut);
    for (let i = 0; i < arrayY.length; i++) {
        let char = arrayY[i];
        if (char.match(/[a]/gi)) {
            count++;
        }
    }

    return count;
}

console.log(repeatedString("abcac", 10)); 
0 голосов
/ 11 июля 2019

Вы можете использовать цикл while для повторения исходной строки, пока длина не будет сопоставлена, а затем match для подсчета чисел a.

function repeatedString(s, n) {
  let i = 0, l = s.length;
  while (s.length < n) s += s[i++ % l]
  return s.match(/a/g).length;
}
console.log(repeatedString("abcac", 10));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...