本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41257397

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.

今天OJ可好几次,提交好几次都出错,最后才发现是自己把题目理解错了,回头想想就觉得好笑。

题目的意思是给定一个整数n,让你求出按照上面规律在执行若干次后所得到的串,其实该算法主要用到递归的思想。

例如n=1时输出“1”,n=2时输出“2”......

我却把题目意思错误地理解为:对于给定的整数n,对该整数n执行N次上述递归操作后得到的串。例如给定2,得到的结果是1112。

当我将给定整数设定为1000时,果断出现内存泄露,想想就觉得可怕。

按照:“对于给定的整数n,对该整数n执行N次上述递归操作后得到的串”的算法描述如下所示:

public class TestCountAndSay {
	private static String countAndSay;

	public static void main(String[] args) {
		countAndSay = countAndSay(12);
		System.err.println(countAndSay);
	}

	public static  String countAndSay(int n) {
		String value = String.valueOf(n);
		for (int i = 0; i < n; i++) {
			value = getAllSays(value);
		}
		return value;
       }

	public  static String getAllSays(String value){
		StringBuffer buffer = new StringBuffer();
		int len = value.length();
		int pos = 0;
		int max = 1;
		for (int i = 1; i <=len;i++ ) {
			if(i<len && (int)value.charAt(i) == (int)value.charAt(pos)){
				max++;
				continue;
			}else{
				buffer.append(String.valueOf(max));
				buffer.append(value.charAt(pos));
				pos = i;
				max = 1;
			}

		}
		return buffer.toString();
	}
}

题目真正的解法如下所示:

	public static String countAndSay(int n) {
		if (n == 1) return "1";
		String s = "1";
		StringBuffer buffer = new StringBuffer();
		//记录重复的值
		int count = 0;
		// 迭代次数
		int round = 0;
		int i;
		while (++round < n) {
			count = 1;
			buffer.setLength(0);
			for (i = 1; i < s.length(); i++) {
				// 重复的值,继续计数
				if (s.charAt(i) == s.charAt(i - 1)) {
					count++;
				} else {
					 // 有新的值出现,记录到buffer
					buffer.append(count).append(s.charAt(i - 1));
					// 重置count
					count = 1;
				}
			}
			buffer.append(count).append(s.charAt(i - 1));
			// 更新s
			s = buffer.toString();
		}
		return buffer.toString();
	}

随机推荐

  1. 初识RabbitMQ系列之二:下载安装

    一:Erlang安装 因为RabbitMQ 是Erlang语言开发的,所以首先要装上Erlang的环境 1)下载Erlang    下载官网:http://www.erlang.org/downloa ...

  2. 15_Python模块化编程_Python编程之路

    之前跟大家讲的是一些python的数据基础,从这篇文章开始,我们开始正式学习python的模块化编程 下面我们解释一下什么叫做模块 之前已经讲过怎么去定义一个方法,如果你是用python交互器(自带交 ...

  3. Create database 创建数据库

    首先在ORACLE用户下进入.bash_profile文件 [oracle@linux02 ~]$ vi .bash_profile export ORACLE_SID=hldbexport ORAC ...

  4. Emacs Python 自动补全--Elpy

    安装方法: 首先,安装一些依赖包: # Either of these pip install rope pip install jedi # flake8 用来检查语法错误 pip install ...

  5. Android开发学习之路--Java和Js互相调用

      随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和io ...

  6. Xcode 调试技巧 --常用命令和断点

    Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令.而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧. ...

  7. Android自定义异常类

    当一个项目中,异常可能出现地方非常多的时候就需要考虑封装处理异常信息.本篇博客就对自定义异常做一个封装,模拟实际开发中的异常处理. 新建一个基类异常HException: public class H ...

  8. Matplotlib Toolkits:地图绘制工具

    Matplotlib Toolkits:地图绘制工具 有没有一种可以直接在详细地图(如谷歌地图)上绘制上百万坐标点的工具???谷歌地图坐标点多了也不能绘制了. Basemap (Not distrib ...

  9. PGM:部分观测数据

    http://blog.csdn.net/pipisorry/article/details/52599451 基础知识 数据缺失的三种情形: 数据的似然和观测模型 Note: MLE中是将联合概率P ...

  10. springMVC源码分析--HandlerMethod

    在之前的博客中我们已经接触过HandlerMethod,接下来我们简单介绍一下HandlerMethod,简单来说HandlerMethod包含的信息包括类.方法和参数的一个信息类,通过其两个构造函数 ...