LeetCode题号:38. 外观数列
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
第一项是数字 1
描述前一项,这个数是 1 即 “一个 1 ”,记作 11
描述前一项,这个数是 11 即 “两个 1 ” ,记作 21
描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211
描述前一项,这个数是 1211 即 “一个 1 一个 2 两个 1 ” ,记作 111221
题目的意思是对序列前一个数进行报数,数列第一项不是1吗,那第二项就报第一项的有1个1,输出11,然后第三项就在第二项的基础上报数,第二项是11,第三项不就是2个1么,然后输出21
示例 1:
输入: 4
输出: "1211"
解释:当 n = 3 时,序列是 "21",其中我们有 "2" 和 "1" 两组,"2" 可以读作 "12",也就是出现频次 = 1 而 值 = 2;类似 "1" 可以读作 "11"。所以答案是 "12" 和 "11" 组合在一起,也就是 "1211"。
解题思路:
1、对比当前生成的字符串前后是否相同,相同就加1
2、如果不相同,就直接写入字符串
3 、注意需要特殊处理,最后的字符判断是没有写入,记得写入
func countAndSay(n int) string { if n == 1 { return "1" } if n == 2{ return "11" } var str,s string var count = 1 str = countAndSay(n - 1) if n > 2 { for i := 1; i <= len(str)-1; i++ { if str[i-1] != str[i] { s += strconv.Itoa(count) + string(str[i-1]) count = 1 }else{ count++ } //处理边界 if i+1 == len(str){ s += strconv.Itoa(count) +string(str[i]) return s } } } return s }