Leetcode #38 報數

題目描述:

报数序列是指一个整照其中的整数的顺序进数序列,按行报数,得到下一个数。其前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被读作  "one 1"  ("一个一") , 即 11
11 被读作 "two 1s" ("两个一"), 即 21
21 被读作 "one 2",  “one 1" ("一个二" ,  "一个一") , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

示例 1:

输入: 1
输出: "1"

示例 2:

输入: 4
输出: "1211"

解法:

一開始看不懂這題在問什麼,看了一下別人的才知道題意。

我們可以理解在第一行的值是1,所以在第二行的時候我們把第一行數字作數量運算,因此叫做“一個一”,那在第三行的時候要把第二行的11進行數量運算,所以叫做”兩個一“,在第四行時候,我們把21稱之為“一個二一個一”,所以返回1211,第五行時候將第四行進行數量運算,所以叫做“一個一、一個二、兩個一”,所以數字為111221,以此類推,我們看一下到第十行會是什麼。

 1.     1
 2.     11
 3.     21
 4.     1211
 5.     111221 
 6.     312211
 7.     13112221
 8.     1113213211
 9.     31131211131221
10.     13211311123113112211

也就是說,我們在示例2時,輸入4,他應該將第三行的21讀成”一個二一個一“,所以輸出1211,也就是要讀取n-1的意思。

先找到相鄰在一起的數字,若重複就進行數量運算,若不重複則把上一次跟這一次的值存起來

 

/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function(n) {
    // 因為第一行是1,所以無論如何回傳值都會是字串1,因此我們直接宣告結果為字串1
    var resultStr = "1";
    // 接著從i = 1位置開始迴圈,因為n=1的結果已經在上一行先宣告了
    for (var i = 1; i < n; i++) {
        // 宣告重複次數從1開始,意思就是如果是"11",會被讀為兩個一,則repeatCount為2
        var repeatCount = 1;      
        var str = "";
        for (var j = 0; j < resultStr.length; j++) {
            // 找出相鄰重複數字,增加重複次數
            if (resultStr[j] == resultStr[j + 1]) {
                repeatCount++;
                console.log("repeatCount" + repeatCount);
            } else {
                // 若不重複,則把"上一個結果" + "重複的次數" + "當前的數字"
                str += repeatCount + resultStr[j];
                console.log(str);
                // 重置重複次數
                repeatCount = 1;
            }
            console.log("i " + i);
            console.log("j " + j);
        }
        // 把當前字串回傳
        resultStr = str;
    }
    return resultStr;
};

上述範例在n=4時,輸出為1211的解

題目連結:https://leetcode-cn.com/problems/count-and-say/description/

Digiprove sealCopyright secured by Digiprove © 2018
Tags :

發表迴響