Leetcode Count and Say 数数列数字

原创 2013年12月03日 08:33:00

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/,未经本作者允许不得转载。

相关文章推荐

学习算法(3)——查找2个数组中的相同元素

这一篇,是在2个数组中,找相同的值。 假设,这两个数组已经排好序(升序),那么只需要遍历一次即可。 首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进 。推进的规则是比较两个数组...

2016届校招 百度WEB前端研发【实习生+提前批】面试经历

2016届校招,实习生面试,后转为提前批面试,拿到提前批offer

《leetCode》:Count and Say

题目The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 1112...

LeetCode Count and say

The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 11122...

【leetcode c++】38 Count and Say

Count and Say The count-and-say sequence is the sequenceof integers beginning as follows: 1, 11, 2...
  • hqq39
  • hqq39
  • 2015年06月26日 22:40
  • 345

[LeetCode][Java] Count and Say

题目: The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 12...

Leetcode - 38. Count and Say

38. Count and Say题目简介 The count-and-say sequence is the sequence of integers beginning as follows:...

leetcode 38:count and say

问题描述:The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, ...

leetcode 题解 || Count and Say 问题

problem: The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 2...

LeetCode Count and Say

题目: The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 12...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode Count and Say 数数列数字
举报原因:
原因补充:

(最多只允许输入30个字)