乘风破浪:LeetCode真题_038_Count and Say

一、前言

    这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势。

二、Count and Say

2.1 问题

2.2 分析与解决

    这道题最难的其实是理解,因为描述的不尽其意,所以很难理解,其实就是根据最开始的字符串,不断的扩展,输入的N,代表的是经过N次之后的结果,与其中的结果没有任何关系。

     /**
* 题目大意
* n=1时输出字符串1;n=2时,数上次字符串中的数值个数,因为上次字符串有1个1,
* 所以输出11;n=3时,由于上次字符是11,有2个1,所以输出21;n=4时,由于上次字符串是21,
* 有1个2和1个1,所以输出1211。依次类推,写个countAndSay(n)函数返回字符串。
*
* 解题思路
* 第一种情况:n<0时返回null。
* 第二种情况:当n=1时,返回1
* 第三种情况:当n>1时,假设n-1返回的字符串是s,对s的串进行处理,对不同的数字
* 进行分组比如112365477899,分成11,2,3,6,5,4,77,8,99。最有就2个1,
* 1个2,1个3,1个6,1个5,一个4,2个7,1个8,2个9,就是211213161614271829,返回此结果。
*/

    理解题意之后,其他的就好办了:

public class Solution {
public String countAndSay(int n) { if (n < 1) {
return null;
} String result = "1";
for (int i = 2; i <= n; i++) {
result = countAndSay(result);
} return result;
} public String countAndSay(String str) {
StringBuilder builder = new StringBuilder(128); int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == str.charAt(i - 1)) {
count++;
} else {
builder.append(count);
builder.append(str.charAt(i - 1));
count = 1;
}
} builder.append(count);
builder.append(str.charAt(str.length() - 1));
return builder.toString();
}
}

     当然也可以用递归来做,其实道理是一样的,速度稍微慢一点:

public class Solution {
public String countAndSay(int n) {
if(n == 1) { return "1"; } String s = countAndSay(n-1); int i = 0;
String out = "";
while(i < s.length()) { int j = i+1;
while(j < s.length() && s.charAt(i) == s.charAt(j)) {
j += 1;
} out = out + (j-i) + s.charAt(i);
i = j;
} return out;
}
}

三、总结

     题目的理解非常重要,有的时候靠自己的猜测是不正确的。

乘风破浪:LeetCode真题_038_Count and Say的更多相关文章

  1. 乘风破浪:LeetCode真题_041_First Missing Positive

    乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...

  2. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  3. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  4. 乘风破浪:LeetCode真题_037_Sudoku Solver

    乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决     这道题 ...

  5. 乘风破浪:LeetCode真题_036_Valid Sudoku

    乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...

  6. 乘风破浪:LeetCode真题_035_Search Insert Position

    乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...

  7. 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array

    乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...

  8. 乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array

    乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array 一.前言     将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知, ...

  9. 乘风破浪:LeetCode真题_032_Longest Valid Parentheses

    乘风破浪:LeetCode真题_032_Longest Valid Parentheses 一.前言 这也是非常有意思的一个题目,我们之前已经遇到过两个这种括号的题目了,基本上都要用到堆栈来解决,这次 ...

随机推荐

  1. MQ5.3在redhat9上的安装

    一.准备工作 1.安装linux软件包 确保系统中有libgcc_s.so和libstdc++.so.3. 如无意外,libgcc_s.so在redhat中已经存在,存放路径为:/usr/lib/gc ...

  2. Hibernate 分页 查询

    昨天的作业  分页: 主要的代码块:(明天实现分页的封装) package com.cy.beans; import java.util.List; /** * 定义一个分页对象 * @author ...

  3. JSP 基础(一)

    JavaServletPage(JSP) 一 JSP简介       Servlet的缺陷       –Servlet的编码.部署和调试任务繁琐       –生成动态网页繁琐,不利于项目分工   ...

  4. MAMP 安装phpredis 扩展

    phpredis扩展包地址: https://github.com/nicolasff/phpredis 1.下载php源码 (http://php.net/releases/  选择php5.5.1 ...

  5. (转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBea ...

  6. Pycharm---新建文件时 自动添加作者时间等信息

    可用的变量有: $ {PROJECT_NAME} - 当前项目的名称. $ {NAME} - 在文件创建过程中在“新建文件”对话框中指定的新文件的名称. $ {USER} - 当前用户的登录名. $ ...

  7. C#+三层+会员管理系统源码

    本打算上51aspx的   但是他们说我做的太简单..,那我还是拿出来共享给大家 源码下载地址 链接:http://pan.baidu.com/s/1boAwv2R 密码:ycrf 源码描述:一.源码 ...

  8. 深入贯彻闭包思想,全面理解JS闭包形成过程

    谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至可以说它们是衡量js工程师实力的一个重要指标.下面我们就罗列闭包的几个常见问题,从回答 ...

  9. Redis简介及应用场景

    一丶Redis介绍 Redis是一个开源的 key—value型 单线程 数据库,支持string.list.set.zset和hash类型数据. 默认端口:6379 默认数据库数量:16 二.优点: ...

  10. Java Service Wrapper--来自官网文件

    -----------------------------------------------------------------------------Java Service Wrapper Pr ...