热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NOI题库(noi.openjudge.cn):1.7编程基础之字符串T31至T35详解与解析

T31至T35题目详细解析了字符串处理的基础编程技巧。其中,T31涉及P型编码,要求将一个仅包含数字字符的字符串转换为特定格式的编码串。例如,输入字符串“111223”应输出相应的P型编码结果。其他题目则涵盖了字符串的多种操作和变换方法,包括但不限于子串提取、字符替换和模式匹配等,旨在提升编程者对字符串处理的综合能力。

T31 字符串P型编码

描述

给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出str的p型编码串。例如:字符串122344111可被描述为"1个1、2个2、1个3、2个4、3个1",因此我们说122344111的p型编码串为1122132431;类似的道理,编码串101可以用来描述1111111111;00000000000可描述为"11个0",因此它的p型编码串即为110;100200300可描述为"1个1、2个 0、1个2、2个0、1个3、2个0",因此它的p型编码串为112012201320。

输入

输入仅一行,包含字符串str。每一行字符串最多包含1000个数字字符。

输出

输出该字符串对应的p型编码串。

样例输入
122344111
样例输出
1122132431

样例

1 #include
2 #include
3 using namespace std;
4 char a[1001];
5 int s;
6 int main()
7 {
8 cin>>a;
9 int q;
10 for(q=0;q//对第一种特殊处理
11 if(a[q]!=a[q+1]) break;
12 else s++;
13 s++;//当break时,由于比较的是q和q+1,第q个与第q-1个是相等的所以s+1
14 if(s==strlen(a))//整个串只有一种的情况
15 {
16 cout<0];
17 return 0;
18 }
19 for(int i&#61;q&#43;1;i//第一次执行else语句输出第一种的情况&#xff0c;然后遍历所有的字符
20 {
21 if(a[i]&#61;&#61;a[i-1]) s&#43;&#43;;
22 else
23 {
24 cout<1];//因为比较的是i和 i-1&#xff0c;输出i-1的情况&#xff0c;所以最后一种在循环里无法输出
25 s&#61;1;//不相等时&#xff0c;自己本身有长度为1&#xff0c;所以s不是0
26 }
27 }
28 cout<1];//输出最后一种
29 }

View Code

T32 行程长度编码

描述

在数据压缩中&#xff0c;一个常用的途径是行程长度压缩。对于一个待压缩的字符串而言&#xff0c;我们可以依次记录每个字符及重复的次数。这种压缩&#xff0c;对于相邻数据重复较多的情况比较有效。 例如&#xff0c;如果待压缩串为"AAABBBBCBB"&#xff0c;则压缩的结果是(A,3)(B,4)(C,1)(B,2)。当然&#xff0c;如果相邻字符重复情况较少&#xff0c;则压缩效率就较低。

现要求根据输入的字符串&#xff0c;得到大小写不敏感压缩后的结果&#xff08;即所有小写字母均视为相应的大写字母&#xff09;。

输入

一个字符串&#xff0c;长度大于0&#xff0c;且不超过1000&#xff0c;全部由大写或小写字母组成。

输出

输出为一行&#xff0c;表示压缩结果&#xff0c;形式为&#xff1a;
(A,3)(B,4)(C,1)(B,2)
即每对括号内部分别为字符&#xff08;都为大写&#xff09;及重复出现的次数&#xff0c;不含任何空格。

样例输入
aAABBbBCCCaaaaa
样例输出
(A,
3)(B,4)(C,3)(A,5)

样例

这个题只需要将T31改改就行 

C&#43;&#43;标准函数库string中自带小写转换成大写strupr&#xff0c;大写转换成小写strlwr&#xff0c;但在noi网站上不能编译&#xff0c;搞不懂为什么&#xff0c;代码如下&#xff1a;

1 #include
2 #include
3 #include
4 using namespace std;
5 char a[1001];
6 int s;
7 int main()
8 {
9 cin>>a;
10 strupr(a);
11 int q;
12 for(q&#61;0;q//对第一种特殊处理
13 if(a[q]!&#61;a[q&#43;1]) break;
14 else s&#43;&#43;;
15 s&#43;&#43;;//当break时&#xff0c;由于比较的是q和q&#43;1&#xff0c;第q个与第q-1个是相等的所以s&#43;1
16 if(s&#61;&#61;strlen(a))//整个串只有一种的情况
17 {
18 printf("(%c,%d)",a[0],s);
19 return 0;
20 }
21 for(int i&#61;q&#43;1;i//第一次执行else语句输出第一种的情况&#xff0c;然后遍历所有的字符
22 {
23 if(a[i]&#61;&#61;a[i-1]) s&#43;&#43;;
24 else
25 {
26 printf("(%c,%d)",a[i-1],s);//因为比较的是i和 i-1&#xff0c;输出i-1的情况&#xff0c;所以最后一种在循环里无法输出
27 s&#61;1;//不相等时&#xff0c;自己本身有长度为1&#xff0c;所以s不是0
28 }
29 }
30 printf("(%c,%d)",a[strlen(a)-1],s);//输出最后一种
31 }

View Code1

另一种小写转换成大写的方式是toupper函数&#xff0c;需要一个字符一个字符的转换&#xff0c;属于cctype函数系列

cctype函数系列归纳&#xff1a;http://blog.csdn.net/dingwood/article/details/7401146

代码如下&#xff08;只需更改上面代码中的strupr语句&#xff09;&#xff1a;

1 #include2 #include3 #include4 using namespace std;5 char a[1001];6 int s;7 int main()8 {9 cin>>a;
10 for(int i&#61;0;i11 a[i]&#61;toupper(a[i]);//更改部分
12 int q;
13 for(q&#61;0;q14 if(a[q]!&#61;a[q&#43;1]) break;
15 else s&#43;&#43;;
16 s&#43;&#43;;//当break时&#xff0c;由于比较的是q和q&#43;1&#xff0c;第q个与第q-1个是相等的所以s&#43;1
17 if(s&#61;&#61;strlen(a))//整个串只有一种的情况
18 {
19 printf("(%c,%d)",a[0],s);
20 return 0;
21 }
22 for(int i&#61;q&#43;1;i23 {
24 if(a[i]&#61;&#61;a[i-1]) s&#43;&#43;;
25 else
26 {
27 printf("(%c,%d)",a[i-1],s);//因为比较的是i和 i-1&#xff0c;输出i-1的情况&#xff0c;所以最后一种在循环里无法输出
28 s&#61;1;//不相等时&#xff0c;自己本身有长度为1&#xff0c;所以s不是0
29 }
30 }
31 printf("(%c,%d)",a[strlen(a)-1],s);//输出最后一种
32 }

View Code2

当然不怕麻烦又有耐心的同志们也可以自己敲大写转换&#xff0c;我这个懒人就不写了

T33 判断字符串是否为回文

描述

输入一个字符串&#xff0c;输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。

输入

输入为一行字符串&#xff08;字符串中没有空白字符&#xff0c;字符串长度不超过100&#xff09;。

输出

如果字符串是回文&#xff0c;输出yes&#xff1b;否则&#xff0c;输出no。

 

样例输入
abcdedcba
样例输出
yes

样例

 

正着倒着一起遍历一遍&#xff0c;不一样就输出no&#xff0c;结束&#xff0c;否则最后输出yes

1 #include
2 #include
3 using namespace std;
4 char a[101];
5 int main()
6 {
7 cin>>a;
8 int i&#61;0,j&#61;strlen(a)-1;
9 while(i<strlen(a))
10 {
11 if(a[i]!&#61;a[j])
12 {
13 cout<<"no";
14 return 0;
15 }
16 else
17 {
18 i&#43;&#43;;j--;
19 }
20 }
21 cout<<"yes";
22 }

View Code

T34 回文子串

描述

给定一个字符串&#xff0c;输出所有长度至少为2的回文子串。

回文子串即从左往右输出和从右往左输出结果是一样的字符串&#xff0c;比如&#xff1a;abba&#xff0c;cccdeedccc都是回文字符串。

输入

一个字符串&#xff0c;由字母或数字组成。长度500以内。

输出

输出所有的回文子串&#xff0c;每个子串一行。
子串长度小的优先输出&#xff0c;若长度相等&#xff0c;则出现位置靠左的优先输出。

 

样例输入
123321125775165561
样例输出
33
11
77
55
2332
2112
5775
6556
123321
165561

样例

 

1 #include
2 #include
3 using namespace std;
4 char a[501];
5 int main()
6 {
7 cin>>a;
8 int len&#61;strlen(a);
9 for(int l&#61;2;l<&#61;len;l&#43;&#43;) //枚举子串长度
10 {
11 for(int q&#61;0;q<&#61;len-l;q&#43;&#43;)//枚举长为l的子串左端点
12 {
13 int z&#61;q&#43;l-1;//长为l的子串的右端点
14 int i&#61;q,j&#61;z;
15 bool ok&#61;true;
16 while(i<&#61;z)
17 {
18 if(a[i]!&#61;a[j])
19 {
20 ok&#61;false;break;
21 }
22 i&#43;&#43;;j--;
23 }
24 if(ok)
25 {
26 for(int k&#61;q;k<&#61;z;k&#43;&#43;) cout<<a[k];
27 cout<<endl;
28 }
29 }
30 }
31 }

View Code

T35 字符串的展开

描述

在初赛普及组的“阅读程序写结果”的问题中&#xff0c;我们曾给出一个字符串展开的例子&#xff1a;如果在输入的字符串中&#xff0c;含有类似于“d-h”或者“4-8”的字串&#xff0c;我们就把它当作一种简写&#xff0c;输出时&#xff0c;用连续递增的字母获数字串替代其中的减号&#xff0c;即&#xff0c;将上面两个子串分别输出为“defgh”和“45678”。在本题中&#xff0c;我们通过增加一些参数的设置&#xff0c;使字符串的展开更为灵活。具体约定如下&#xff1a;

(1) 遇到下面的情况需要做字符串的展开&#xff1a;在输入的字符串中&#xff0c;出现了减号“-”&#xff0c;减号两侧同为小写字母或同为数字&#xff0c;且按照ASCII码的顺序&#xff0c;减号右边的字符严格大于左边的字符。

(2) 参数p1&#xff1a;展开方式。p1&#61;1时&#xff0c;对于字母子串&#xff0c;填充小写字母&#xff1b;p1&#61;2时&#xff0c;对于字母子串&#xff0c;填充大写字母。这两种情况下数字子串的填充方式相同。p1&#61;3时&#xff0c;不论是字母子串还是数字字串&#xff0c;都用与要填充的字母个数相同的星号“*”来填充。

(3) 参数p2&#xff1a;填充字符的重复个数。p2&#61;k表示同一个字符要连续填充k个。例如&#xff0c;当p2&#61;3时&#xff0c;子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。

(4) 参数p3&#xff1a;是否改为逆序&#xff1a;p3&#61;1表示维持原来顺序&#xff0c;p3&#61;2表示采用逆序输出&#xff0c;注意这时候仍然不包括减号两端的字符。例如当p1&#61;1、p2&#61;2、p3&#61;2时&#xff0c;子串“d-h”应扩展为“dggffeeh”。

(5) 如果减号右边的字符恰好是左边字符的后继&#xff0c;只删除中间的减号&#xff0c;例如&#xff1a;“d-e”应输出为“de”&#xff0c;“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符&#xff0c;输出时&#xff0c;要保留中间的减号&#xff0c;例如&#xff1a;“d-d”应输出为“d-d”&#xff0c;“3-1”应输出为“3-1”。

输入

包括两行&#xff1a;
第1行为用空格隔开的3个正整数&#xff0c;一次表示参数p1&#xff0c;p2&#xff0c;p3。
第2行为一行字符串&#xff0c;仅由数字、小写字母和减号“-”组成。行首和行末均无空格。

40%的数据满足&#xff1a;字符串长度不超过5&#xff1b;
100%的数据满足&#xff1a;1<&#61;p1<&#61;3&#xff0c;1<&#61;p2<&#61;8&#xff0c;1<&#61;p3<&#61;2。字符串长度不超过100。

输出

只有一行&#xff0c;为展开后的字符串。

 

样例输入
样例 #
1&#xff1a;
1 2 1
abcs
-w1234-9s-4zz样例 #2&#xff1a;
2 3 2
a
-d-d样例 #3&#xff1a;
3 4 2
di
-jkstra2-6
样例输出
样例 #
1&#xff1a;
abcsttuuvvw1234556677889s
-4zz样例 #2&#xff1a;
aCCCBBBd
-d样例 #3&#xff1a;
dijkstra2
************6

样例

 

模拟&#xff0c;依次枚举每个‘-’&#xff0c;参数p1和p2可以放在一起判断。

开头或结尾的-直接else输出 &#xff1b;

几个-连在一起&#xff0c;直接输出- &#xff1b;

-两边是字符和数字或者没有按升序排列&#xff0c;输出-&#xff1b;因为字母的acsll码本来就大于数字的&#xff0c;所以只需要另判断左边是数字右边是字母即可 

对于p1&#xff0c;大写转换成小写可以用tolower&#xff08;&#xff09;&#xff0c;将括号内的字母大写转换成小写&#xff0c;对于原本是小写的字母返回本身&#xff0c;小写转换成大写用toupper

p3的逆序可以直接用reverse函数&#xff0c;头文件algorithm&#xff0c;格式reverse&#xff08;要翻转数组的第一个元素的位置&#xff0c;最后一个元素的后一个位置&#xff09;

C&#43;&#43;在for循环时自动完成整形与字符型的转换&#xff0c;所以对于字母也可以和数字一样进行循环

一定要特别注意本题可能出现开头是‘-’&#xff0c;末尾是‘-’&#xff0c;好多个‘-’连起来的情况

1 #include
2 #include
3 #include
4 using namespace std;
5 int p1,p2,p3,len,sum;
6 char a[30000],b[30000];
7 int main()
8 {
9 cin>>p1>>p2>>p3>>a;
10 len&#61;strlen(a);
11 for(int i&#61;0;i)
12 if(a[i]&#61;&#61;&#39;-&#39;&&i&&i<&#61;strlen(a)-2)//开头或结尾的-直接else输出
13 {
14 if(a[i-1]&#61;&#61;&#39;-&#39;||a[i&#43;1]&#61;&#61;&#39;-&#39;) cout<<&#39;-&#39;;//几个-连在一起&#xff0c;直接输出-
15 else if(a[i&#43;1]&#61;&#61;a[i-1]&#43;1) continue;//-两边ascll码是连续的&#xff0c;跳过-
16 else if(a[i-1]>&#61;a[i&#43;1]||(a[i-1]<&#61;&#39;9&#39;&&a[i&#43;1]>&#61;&#39;A&#39;)) cout<<&#39;-&#39;;//-两边是字符和数字或者没有按升序排列&#xff0c;输出-&#xff1b;因为字母的acsll码本来就大于数字的&#xff0c;所以只需要另判断左边是数字右边是字母即可
17 else
18 {
19 int l&#61;0;
20 if(p1&#61;&#61;1)
21 {
22 for(int j&#61;a[i-1]&#43;1;j1];j&#43;&#43;)//枚举过程中字符型自动转化为整形
23 {
24 for(int k&#61;1;k<&#61;p2;k&#43;&#43;)
25 b[l&#43;&#43;]&#61;tolower((char)j);//整形强制转换成字符型
26 }
27 }
28 else if(p1&#61;&#61;2)
29 {
30 for(int j&#61;a[i-1]&#43;1;j1];j&#43;&#43;)
31 {
32 for(int k&#61;1;k<&#61;p2;k&#43;&#43;)
33 b[l&#43;&#43;]&#61;toupper((char)j);
34 }
35 }
36 else
37 {
38 for(int j&#61;a[i-1]&#43;1;j1];j&#43;&#43;)
39 {
40 for(int k&#61;1;k<&#61;p2;k&#43;&#43;)
41 b[l&#43;&#43;]&#61;&#39;*&#39;;
42 }
43 }
44 if(p3&#61;&#61;2)
45 reverse(b,b&#43;l);//数组翻转
46 for(int j&#61;0;j)
47 cout<<b[j];
48 }
49 }
50 else cout<<a[i];
51 }

View Code

第一遍交WA&#xff0c;原因&#xff1a;没有判断减号两边是字母和数字的情况&#xff0c;左字母右数字&#xff0c;字母的ascll码大于数字&#xff0c;所以输出-正确&#xff1b;左数字右字母&#xff0c;就按升序做了&#xff0c;错误

第二遍交RE&#xff0c;原因&#xff1a;忽略了开头或结尾可能是-&#xff0c;因为数组从0开始&#xff0c;数组大小有恰好卡到题目给出的范围&#xff0c;比较减号两边的数要-1或&#43;1&#xff0c;数组越界了

第三遍交WA&#xff0c;原因&#xff1a;没有考虑好几个-相连的情况。几个减号相连&#xff0c;对中间的-没有影响&#xff0c;因为左右都是-&#xff0c;可以通过-两边的ascll码相等排除&#xff1b;对于最右边的-&#xff0c;左边是-&#xff0c;右边是数字或字母&#xff0c;由于-的ascll码是155&#xff0c;大于数字和字母的&#xff0c;可以通过减号右边的字符按照ASCII码的顺序小于左边字符排除;但对于最左边的-&#xff0c;左边是数字或字母&#xff0c;右边是-&#xff0c;就按升序做了&#xff0c;错误

第四遍交RE&#xff0c;原因&#xff1a;数组开小了&#xff0c;开始时待反转数组b开到了101&#xff0c;根据题目&#xff0c;极限扩展情况为a-z或A-Z&#xff0c;要扩展出24*8&#61;192个

noip题毕竟是noip题啊&#xff0c;看着简单不好得分&#xff0c;很多种情况需要仔细考虑

 

转:https://www.cnblogs.com/TheRoadToTheGold/p/6106463.html



推荐阅读
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 题目概述:Sereja 拥有一个由 n 个整数组成的数组 a1, a2, ..., an。他计划执行 m 项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • C/C++中一级指针的内存模型与示例代码
    本文通过一个具体的C/C++代码示例,详细解析了一级指针在内存中的布局和工作原理。包括了对不同类型的指针变量如何在内存中分配空间的讨论。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
author-avatar
开心123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有