как построить подсчет и сказать проблему в javascript - PullRequest
5 голосов
/ 21 марта 2020

Я пытаюсь решить следующую проблему в JavaScript

Последовательность подсчета и произнесения - это последовательность целых чисел, начинающаяся следующим образом:

1, 11, 21, 1211, 111221, ...
1 is read off as one 1 or 11.
11 is read off as two 1s or 21.

21 is read off as one 2, then one 1 or 1211.

Given an integer n, generate the nth sequence.

Note: The sequence of integers will be represented as a string.

Example:

if n = 2,
the sequence is 11.

Итак, я хочу создать функцию, которая передает N целое число и дает ему значение

Вот мой код:

let countAndSay = function (A) {
    if (A == 1) return "1"
    if (A == 2) return "11"
    let str ="11"
    if(A > 2){
     // count 
    }
}

Я не понимаю логику c для как построить это.

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Вы должны иметь возможность динамически определять количество и тип кусков, которые есть в строке, что можно сделать довольно кратко с помощью регулярного выражения. Чтобы найти строку для деконструкции по индексу n, рекурсивно вызовите countAndSay, чтобы получить результат n - 1:

let countAndSay = function (count) {
  if (count === 1) {
    return '1';
  }
  const digitsArr = countAndSay(count - 1).match(/(\d)\1*/g);
  // You now have an array of each chunk to construct
  // eg, from 1211, you get
  // ['1', '2', '11']
  return digitsArr // Turn the above into ['11', '12', '21']:
    .map(digitStr => digitStr.length + digitStr[0])
    .join(''); // Turn the above into '111221'
};
console.log(
  countAndSay(1),
  countAndSay(2),
  countAndSay(3),
  countAndSay(4),
  countAndSay(5),
);
1 голос
/ 21 марта 2020

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

function next(s) {
    s = s + "*";  // add a flag value at the end of the string
    var output = "";
    var j = 0;
    for (var i = 1; i < s.length; i++) {
        if (s.charAt(i) != s.charAt(i - 1)) { // if the character changes, concatenate the amount (i - j) and the digit
            output += (i - j) + s.substring(j, j+1);
            j = i;
        }
    }
    return output;
}

Тогда вам нужно будет рекурсивно запускаться next N раз.

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