热门标签 | 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



推荐阅读
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • CentOS系统安装与配置常见问题及解决方案
    本文详细介绍了在CentOS系统安装过程中遇到的常见问题及其解决方案,包括Vi编辑器的操作、图形界面的安装、网络连接故障排除等。通过本文,读者可以更好地理解和解决这些常见问题。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 解决SVN图标显示异常问题的综合指南
    本文详细探讨了SVN图标无法正常显示的问题,并提供了多种有效的解决方案,涵盖不同环境下的具体操作步骤。通过本文,您将了解如何排查和修复这些常见的SVN图标显示故障。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • Python第三方库安装的多种途径及注意事项
    本文详细介绍了Python第三方库的几种常见安装方法,包括使用pip命令、集成开发环境(如Anaconda)以及手动文件安装,并提供了每种方法的具体操作步骤和适用场景。 ... [详细]
  • 在跨浏览器开发中,一个常见的问题是关于如何在鼠标悬停时显示图片提示信息。本文深入探讨了 IE 浏览器对 IMG 元素 alt 属性的特殊处理,并提供了最佳实践建议。 ... [详细]
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社区 版权所有