标签:测试 http for apache names namespace 位置 pre lan
外观数列是指具有以下特点的整数序列:
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 也成立。本题要求你推算任意给定数字 d
的外观数列的第 N 项。
输入第一行给出 [0,9] 范围内的一个整数 d
、以及一个正整数 N(≤ 40),用空格分隔。
在一行中给出数字 d
的外观数列的第 N 项。
1 8
1123123111
题目描述有点迷惑 简单说就是 数列第一项为 d ,从第二项开始 字符串中 每两个数字为 字符和字符个数 这一对组合 和前面的1078字符串压缩 基本上相同
从1开始就是 1 11 12 1121 122111 由d=1开始的序列和题目描述完全不同 , 所以题目中强调了d从不等于1时开始, 但因为测试用例给出的d=1,有一点迷惑
从2开始就是 2 21 2111 2113 211231 这个时候就和题目描述相同了
看别人的方法 https://www.liuchuo.net/archives/4646
比较巧妙的利用了循环的结构
令 k=j 结束后 下标 k 会等于 循环次数+1 这个特点 用来计数 str[k]==str[j] 字符相同的个数 既k-j
然后j进入下一轮循环的时候 j=k ; j从k位置开始找
#include <iostream> using namespace std; int main(){ int n; char d; string str,temp; cin >> d >> n; str.push_back(d); for(int i=0;i<n-1;i++){ string result; int k; for(int j=0;j<str.size();j=k){ for(k=j;k<str.size()&&str[k]==str[j];k++); result+=str[j]+to_string(k-j); } str=result; } cout << str<<endl; return 0; }
#include <iostream> using namespace std; int main(){ int n; char d; string str,temp; cin >> d >> n; str.push_back(d); for(int i=0;i<n-1;i++){ string result; str.push_back(‘ ‘); int left{0},right{0}; while(left<str.size()-1){ int count=0; right=left; while(right<str.size()){ if(str[right]==str[left]){ count++; }else{ result.push_back(str[left]); result.push_back(count+‘0‘); break; } right++; } left+=count; } str=result; } cout << str<<endl; return 0; }
PTA basic 1084 外观数列 (20 分) c++语言实现(g++)
标签:测试 http for apache names namespace 位置 pre lan
原文地址:https://www.cnblogs.com/ichiha/p/14766429.html