LeetCode刷题(13)--外观数列(递归算法实现)

题目描述

给定一个正整数 n ,输出外观数列的第 n 项。
外观数列是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
前五项如下:
1 1
2 11
3 21
4 1211
5 111221

第一项为1
第二项为11表示前一项有1个1
第三项为21,表示前一项有2个1
第四项为1211,表示前一项有1个2和1个1
第五项为111221,表示前一项有1个1,1个2和2个1

示例:
输入:n = 1
输出:“1”

示例:
输入:n = 4
输出:“1211”

1 <= n <= 30

解题思路

string to_string(int n)
{
	char str[32]={NULL,};
	string s1;
	sprintf(str,"%d",n);
	s1=str;
	return s1;
}

string Shulie(int n)
{
	if(n==1)
		return "1";
	string Pre=Shulie(n-1)+'0';
	string  res;
	
	int len=Pre.size();
	int i=0;
	for(int j=0;j<len;j++)
	{
		if(Pre[i]==Pre[j])
		{
			continue;
		}
		else
		{
			res+=to_string(j-i)+Pre[i];
			i++;
		}
	}
	return res;
}
int main()
{
	cout<<Shulie(3)<<endl;
	cout<<Shulie(5)<<endl;
	return 0;
}	

结果:
在这里插入图片描述

注意:
1.to_string()方法在c++11以后为系统支持的函数,此前的版本都没有此函数,需要自己定义。
2.string 结尾+‘0’,在c++11以后系统会自动添加,如果是此前版本需要手动添加,并且编译器的不同,效果也不一样,比如在VC6中编译,不加’0’也可以通过,但是有些编译器不加会无法输出值,主要原因是C语言在读取字符串时需要一个特殊字符0来标记指针结束的位置,也就是结束标记,如果没有此标记,那么不会有值输出。

分析:
1.如果输入1,直接返回字符"1"。
2.定义字符串Pre用来存储前一个字符串。
3.获取前一个字符串长度。
4.遍历前一个字符串。
5.如果第i个元素和第j个元素相同,继续。
6.如果不同,记录此时字符串为"j-i"+Pre[i],表示几个几。
7.遍历结束,返回此时的字符串。

假设此时数字为3,那么此函数会遍历字符串"11"
1.判断Pre[0]=Pre[0],继续
2.判断Pre[0]=Pre[1],继续
3.判断Pre[0]=Pre[2], Pre[0]=1,Pre[2]=0,不等,res=to_string(2)+Pre[0]=“21”;

猜你喜欢

转载自blog.csdn.net/baidu_41191295/article/details/113483208