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/
Copyright secured by Digiprove © 2018
Vance
0
Tags :