题目描述
有一个数列a[N] (N=60),从a[0]开始,每一项都是一个数字。数列中a[n+1]都是a[n]的描述。其中a[0]=1。规则如下:
- a[0]:1
- a[1]:11(含义:其前一项a[0]=1是1个1,即“11”。表示a[0]从左到右,连续出现了1次“1”)
- a[2]:21(含义:其前一项a[1]=11,从左到右:是由两个1组成,即“21”。表示a[1]从左到右,连续出现了两次“1”)
- a[3]:1211(含义:其前一项a[2]=21,从左到右:是由一个2和一个1组成,即“1211”。表示a[2]从左到右,连续出现了1次“2”,然后又连续出现了1次“1”)
- a[4]:111221(含义:其前一项a[3]=1211,从左到右:是由一个1、一个2、两个1组成,即“111221”。表示a[3]从左到右,连续出现了1次“1”,连续出现了1次“2”,连续出现了两次“1”)
请输出这个数列的第n项结果(a[n],0≤n≤59)。
输入描述
数列的第n项(0≤n≤59)
4
输出描述
数列的内容
111221
用例
输入 | 4 |
输出 | 111221 |
说明 | 无 |
题目解析
这题是一个典型的动态规划题目,因为它存在明显的:下一个阶段状态依赖于上一个阶段状态,存在状态转移。
这题难点在于找状态转移方程,即上一个状态与上一个状态之间的变化关系,按照题目意思应该是一种描述关系。即下一个状态是对于上一个状态的描述。
我这边实现:比如上一个状态是1211,则将其转为字符数组arr,取出第0个字符缓存到变量val中,并定义一个变量count,用于记录val字符出现的次数。
然后开始遍历字符数组,从第1个开始遍历,比较arr[0]和arr[1],如果相同,则count++,如果不同,则输出描述count + "" + val,然后将arr[1]作为新的val,并且count重置为1,接着比较arr[1]和arr[2],逻辑如上。
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const n = parseInt(line);
console.log(getSeq(n));
});
/* 算法逻辑 */
function getSeq(n) {
let base = "1";
for (let i = 1; i <= n; i++) {
base = describe(base);
}
return base;
}
function describe(seq) {
let res = [];
let count = 1;
let val = seq[0];
for (let i = 1; i < seq.length; i++) {
if (seq[i] === seq[i - 1]) {
count++;
} else {
res.push(count);
res.push(val);
count = 1;
val = seq[i];
}
}
res.push(count);
res.push(val);
return res.join("");
}
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(getSeq(n));
}
public static String getSeq(int n) {
String base = "1";
for (int i = 1; i <= n; i++) {
base = describe(base);
}
return base;
}
public static String describe(String seq) {
StringBuilder sb = new StringBuilder();
int count = 1;
char val = seq.charAt(0);
for (int i = 1; i < seq.length(); i++) {
if (seq.charAt(i) == seq.charAt(i - 1)) {
count++;
} else {
sb.append(count).append(val);
count = 1;
val = seq.charAt(i);
}
}
sb.append(count).append(val);
return sb.toString();
}
}
Python算法源码
# 输入获取
n = int(input())
def describe(seq):
res = []
count = 1
val = seq[0]
for i in range(1, len(seq)):
if seq[i] == seq[i - 1]:
count += 1
else:
res.append(count)
res.append(val)
count = 1
val = seq[i]
res.append(count)
res.append(val)
return "".join(map(str, res))
# 算法入口
def getResult():
base = "1"
for i in range(1, n + 1):
base = describe(base)
return base
# 算法调用
print(getResult())
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0