导航
-
-
- [1. 简介](#1. 简介)
- [2. 生成规则](#2. 生成规则)
- [3. 代码演示](#3. 代码演示)
-
1. 简介
外观数列是指数列中的每一项都是描述前一项的外观或者外貌。它通常由初始项开始,通过描述前一项的外观来生成下一项。外观数列最初由John H. Conway在1969年发现,并在他的著作《外貌数列和自动机理论》(The Construction of Look and Say Sequences and Machines)中进行了详细的研究。
2. 生成规则
外观数列的生成规则很简单:从任意正整数开始,逐项地描述前一项的外观,将描述结果作为下一项。
例如,以数字"1"开始的外观数列的前几项如下所示:
第一项:1
第二项:11(描述第一项为"1个1")
第三项:21(描述第二项为"2个1")
第四项:1211(描述第三项为"1个2、1个1")
第五项:111221(描述第四项为"1个1、1个2、2个1")
通过这个规则,可以一直生成下去,生成的数列会越来越长。
3. 代码演示
假设: 给定一个正整数 n,输出外观数列的第 n 项。
注意:整数序列以字符串形式给出,以便能够表达任意长度的数字序列。
javascript
public class LookAndSaySequence {
public static String countAndSay(int n) {
if (n == 1) return "1";
String prev = "1"; // 最终输出的数字
System.out.println("第1项=" + prev);
for (int i = 2; i <= n; i++) {
StringBuilder stringBuilder = new StringBuilder();
int count = 1; //记录相同数字出现的次数
for (int j = 1; j < prev.length(); j++) {
if (prev.charAt(j - 1) == prev.charAt(j)) {
count++;
} else {
stringBuilder.append(count).append(prev.charAt(j - 1));
count = 1; //相同数字出现的次数重置为1
}
}
stringBuilder.append(count).append(prev.charAt(prev.length() - 1));
prev = stringBuilder.toString();
System.out.println("第" + i + "项=" + prev);
}
return prev;
}
public static void main(String[] args) {
//输出第五项
System.out.println(countAndSay(5));
}
}
输出结果: