Let Code符号化問題2021年6月17日-Count and Say


[質問]


The count-and-say sequence is a sequence of digit strings defined by the recursive formula:
  • countAndSay(1) = "1"
  • countAndSay(n) is the way you would "say"the digit string from countAndSay(n-1), which is then converted into a different digit string.
  • To determine how you "say"a digit string, split it into the minimal number of groups so that each group is a contiguous section all of the same character. Then for each group, say the number of characters, then say the character. To convert the saying into a digit string, replace the counts with a number and concatenate every saying.
    For example, the saying and conversion for digit string "3322251":

    Given a positive integer n, return the nth term of the count-and-say sequence.
    Example 1:
    Input: n = 1
    Output: "1"
    Explanation: This is the base case.
    Example 2:
    Input: n = 4
    Output: "1211"
    Explanation:
    countAndSay(1) = "1"
    countAndSay(2) = say "1"= one 1 = "11"
    countAndSay(3) = say "11"= two 1's = "21"
    countAndSay(4) = say "21"= one 2 + one 1 = "12"+ "11"= "1211"
    (要約)与えられた文字列数が개수, 숫자, 개수, 숫자, ...となるようにn回繰り返した場合、returnの値が得られる(問題は分かりやすいが、言語で説明するのは難しい)

    [回答]

    var countAndSay = function(n) {
      let answer = '1';
    
      for(let i = 0; i < n - 1; i++) {
        answer = change(answer);
      }
    
      return answer;
    };
    
    function change(num) {
      const str = num + '';
      const arr = [[0, str[0]|0]];
      let index = 0;
     
      for(let i = 0; i < str.length; i++) {
        if(arr[index][1] !== (str[i]|0)) {
          arr.push([1, str[i]|0]);
          index++;
        }
        else {
          arr[index][0]++;
        }
      }
    
      return arr.flat().join('');
    }
    デフォルト値は1で、n - 1回繰り返します.
    重複する内容は、前から現在の数値からなる文字列を数え、同じ数値を別の数値に数え、変更した数値を別の数値に数え、新しい文字列を繰り返し作成します.
    以前に同じ数字が出ていても、カウントは再開されます.
    配列要素をflat()で展開すると、並べ替えを行わずに2 D配列を作成し、[個数、数値]として含めることができます.