您的位置:首页 > 其它

Leetcode Count and Say 数数列数字

2013-12-03 08:33 489 查看
Count and Say

The count-and-say sequence is the sequence of integers beginning as follows:

1, 11, 21, 1211, 111221, ...


1
is read off as
"one
 1"
or
11
.

11
is read off as
"two
 1s"
or
21
.

21
is read off as
"one
 2
, then
one 1"
or
1211
.

Given an integer n, generate the nth sequence.

Note: The sequence of integers will be represented as a string.

这个是facebook的面试题,题目不好理解。

这样说会比较清楚:

其实就是一个数列n=1的时候数列为1; n=2,数列为11,n=3数列为21;n=4数列为1211;n=5数列是111221

n=2的时候数数列1有什么数字; n=3的时候数数列2有什么数字; n=4的时候数数列3有什么数字……

我的解法,利用两个临时string,数一个string存入另外一个,如此反复。

class Solution {
public:
	string countAndSay(int n) 
	{
		if (n == 0) return "";
		string str = "1";
		for (int i = 1; i < n; i++)
		{
			char ch = '0';
			string str2 = "";
			int counting = 0;
			for (int j = 0; j < str.length(); j++)
			{
				if (str[j] == ch) counting++;
				else
				{
					if (counting > 0)
						str2 = str2 + char(counting + '0') +ch;
					counting = 1;
					ch = str[j];
				}
			}
			str2 = str2 + char(counting + '0') +ch;
			str = str2;
		}
		return str;
	}
};


下面是leetcode上比较不错的算法:

http://discuss.leetcode.com/questions/217/count-and-say

class Solution {
public:
	string getNext(string &s) 
	{
		if(s == "") return "1";
		string temp = "";
		for(int i = 0; i < s.size(); i++) {
			int cnt = 1;
			while(i+1 < s.size() && s[i] == s[i+1]) {
				i++;
				cnt++;
			}
			stringstream ss;
			ss << cnt;
			temp += ss.str();
			temp += s[i];
		}
		return temp;
	}
	string countAndSay(int n) 
	{
		string s = "";
		if(n == 0) return s;

		for(int i = 0; i < n; i++) {
			s = getNext(s);            
		}           
		return s;
	}
};




更新下面的程序更加清晰快速点,4ms

//2014-1-26
class Solution {
public:
	string countAndSay(int n) 
	{
		string rs;
		string tmp;
		if (n==0) return rs;
		rs.push_back('1');

		for (int i = 1; i < n; i++)
		{
			int c = 1;//注意:牢记每次都需要重置的时候一定要重置,否则答案错误!!!
			for (int j = 1; j < rs.length(); j++)
			{
				if (rs[j] == rs[j-1]) c++;
				else
				{
					tmp.push_back(c+'0');
					tmp.push_back(rs[j-1]);
					c = 1;
				}
			}
			tmp.push_back(c+'0');
			tmp.push_back(rs.back());
			rs.clear();
			rs.swap(tmp);
		}
		return rs;
	}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: