外观数列

外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

1. 1
2. 11
3. 21
4. 1211
5. 111221
1 被读作  "one 1"  ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
解题思路:要得到第n行的字符串,要先得到第n-1行的字符串。通过遍历第n-1行的字符串,得到每个字符出现的次数count和该字符ch,那么第n行的新字符串就由count和ch构成。如果直接递归,必然超时。因此,可以通过在同一个函数中从第一行或第二行的字符串开始用循环推导出余下行的字符串即可。

1.我的代码:

class Solution {

public String countAndSay(int n) {

if(n==1){

return "1";

}

else if(n==2){

return "11";

}

else{

String str="11";

for(int i=2;i<n;i++){

StringBuilder sb=new StringBuilder();

for(int j=0;j<str.length();j++){

char ch1=str.charAt(j);

int count=1;

for(int k=j+1;k<str.length();k++){

char ch2=str.charAt(k);

if(ch1==ch2){

count++;

j=k;

}

else {

break;

}

}

sb.append(count).append(ch1);

}

str=sb.toString();

}

return str;

}

}

}

2.题解代码:

public String countAndSay(int n) {
String str = "1";
for (int i = 2; i <= n; i++) {
StringBuilder builder = new StringBuilder();
char pre = str.charAt(0);
int count = 1;
for (int j = 1; j < str.length(); j++) {
char c = str.charAt(j);
if (c == pre) {
count++;
} else {
builder.append(count).append(pre);
pre = c;
count = 1;
}
}
builder.append(count).append(pre);
str = builder.toString();
}

return str;
}

作者:pphdsny
链接:https://leetcode-cn.com/problems/count-and-say/solution/38-bao-shu-java-xun-huan-by-pphdsny/
来源:力扣(LeetCode)

我的代码和题解代码的差别在于,多了一个for循环。但其实这一for循环是没有必要增加的。

原文地址:https://www.cnblogs.com/xbc121/p/12252749.html

时间: 2024-10-30 04:55:00

外观数列的相关文章

PAT 1084 外观数列python解法

外观数列是指具有以下特点的整数序列:d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述.比如第 2 项表示第 1 项有 1 个 d,所以就是 d1:第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111.又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231.当然这个定义对 d = 1 也成立.本

PAT 1084 外观数列

https://pintia.cn/problem-sets/994805260223102976/problems/994805260583813120 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述.比如第 2 项表示第 1 项有 1 个 d,所以就是 d1:第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就

PAT Basic 1084

1084 外观数列 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述.比如第 2 项表示第 1 项有 1 个 d,所以就是 d1:第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111.又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231.当然这个定义对

ARTS Week 7

Dec 9, 2019 ~ Dec 15, 2019 Algorithm Problem 38.Count And Say 外观数列 题目链接 题目描述: 外观数列 是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述.前六项及其说明如下: 1 // base 11 // 描述[1]:1个1 -> 11 21 // 描述[2]:2个1 -> 21 1211 // 描述[3]:1个2,1个1 -> 1211 111221 // 描述[4]:1个1,1个2,2个1 ->

2 结构型模式之 - 外观模式

外观模式的介绍:外观模式在开发运用中的频率非常高,尤其是现阶段各种第三方SDK充斥在我们的周边,而这些SDK很大概率会使用外观模式,通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样就能够降低用户使用的复杂度,也对用户屏蔽了很多实现细节,当然 ,在我们的开发过程中,外观模式也是我们封装API的常用手段,例如网络模块,ImageLoader模块等.可能你已经在开发中运用过无数次外观模式,只是没有理论层面上认识它,本章我们就从理论与实践相结合的方式来理解外观模式 外观模式的定义: 要求一个

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

HDU 5783 Divide the Sequence(数列划分)

HDU 5783 Divide the Sequence(数列划分) Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem Description - 题目描述 Alice has a sequence A, She wants to split A into as much as possible continuous subsequences, satisfy

设计模式(九):外观模式

一.概述 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 二.解决问题 在上一讲中,我们学习了适配器模式,它是用来转换一个接口的,而外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口就可以达到目的.想想现实生活中例子,我们在pc上安装软件的时候经常有默认安装或者是一键安装选项(省去选择安装目录.安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作).总之,外观模式就是解决多个复杂接口带来的使用困难,起到简

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl