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/

Vance
0
Tags :