Leetcode_38_count-and-say
本文是在学习中的总结,欢迎转载但请注明出处: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(); }
随机推荐
- JS运行机制之 Event Loop 的思考
先举个栗子,如下: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); //一秒之后输出几乎没 ...
- Linux中Mysql root用户看不到mysql库问题解决方式
第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables & ...
- Ubuntu 14.04 16.04 17.10 + Win10 双系统安装记录 + 分区大小选择办法
安装了N遍,重要的东西在此记录. 参考了 http://www.libinx.com/2017/five-steps-win10-ubuntu-dual-boot/ 忠告:为了让日后喘气能匀呼些,要选 ...
- Spring消息之AMQP.
一.AMQP 概述 AMQP(Advanced Message Queuing Protocol),高级消息队列协议. 简单回忆一下JMS的消息模型,可能会有助于理解AMQP的消息模型.在JMS中,有 ...
- .NET Core 网络数据采集 -- 使用AngleSharp做html解析
有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: ...
- ACM Sudoku
Sudoku是一个非常简单的任务. 具有9行9列的方形表被划分为9个较小的正方形3x3,如图所示. 在一些单元格中写入从1到9的十进制数字.其他单元格为空. 目标是填充空单元格,其中十进制数字从1到9 ...
- JavaScript 知识图谱
- cassandra 3.x官方文档(4)---分区器
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- mysql和postgresql转义字符探究
总结 mysql依靠反斜杠\转义, postgresql 依靠单引号转义 mysql 客户端 mysql> create table usr (name varchar(), age integ ...
- Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...