LeetCode-38. 外观数列(Goland实现)

196 阅读2分钟

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
}

❤如果文章对您有所帮助,就在文章的右上角或者文章的末尾点个赞吧!(づ ̄ 3 ̄)づ

❤如果喜欢大白兔分享的文章,就给大白兔点个关注吧!(๑′ᴗ‵๑)づ╭❤~

❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】

❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复讨论(请勿发表攻击言论)。