靖空间

专注,努力不会白费的!

Leetcode Count and Say 数数列数字

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;
	}
};

 

 

阅读更多
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者允许不得转载。 https://blog.csdn.net/kenden23/article/details/17081853
个人分类: Algorithm算法
上一篇LeetCode Sudoku Solver 数独C++程序
下一篇LeetCode Search Insert Position查找插入位置
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭