1. 程式人生 > 其它 >LeetCode刷題(13)--外觀數列

LeetCode刷題(13)--外觀數列

技術標籤:刷題!!!c++leetcode

題目描述

給定一個正整數 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;
}	

結果:
在這裡插入圖片描述

注意:
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”;