@pandaoxi2022
2022-08-02T20:49:39.000000Z
字数 7181
阅读 367
基础知识
ring
string是c++的stl(standard template library 标准模板库)提供的字符串类,用于处理字符串相
关的问题
]的区别
1.字符数组本质是数组,因此长度固定;string可以理解为长度不限的
字符串.
2.字符数组的系统定义的函数过少,操作不方便;string集成大量的系统函数,方
便操作.
3.字符数组不能比较及+运算;string可以直接作比较
和运算.
ng操作
入和遍历
s1后面
`
``
/*
1093 - 【入门】打印
小写字母表
题目描述
把英文字母表的小写字母按顺序和倒序打印出来。(每行
13个
)
输入
无
输出
输出四
行
样例
输入复制
输出复制
abcdefgh
ijklm
nopqrstu
vwxyz
zyxwvuts
rqpon
mlkjihgf
edcb
a
*/
++.h>
using namespace
std;
int ma
in()
{
/*
1.升序
利用字符的ascii码值,或者直接写'a',循环遍历,将每次的字符连接
到s的末尾
2
. 降序
3.简单算法,可单独判断到某个字符
之后换行
*/
stri
ng s;
ch
ar c;
for(c='a';c<='z';
c++){
s +
= c ;
if((c-'a'+1)%13==0) s+=
'\n'
;
}
for(c='z';c>='a';
c--){
s +
= c ;
if(('z'-c+1)%13==0) s+=
'\n'
;
}
cout<
endl;
retu
rn
0;
}
`
``
/*
1115 - 【入
门】数字和
题目描述
输入一个很大的数,求各位上的
数字和
。
输入
一个很大的整数(不超过2
00位
)
输出
一个整
数
样例
输入复
制
123
输
出复制
6
*/
#include <bits/stdc
++.h>
using namespace
std;
//变量定义到main函数外边为全局变量,全局变量在整个程序所有函数中都
可以使用.
//局部变量仅在定义时对应的大括
号内有效
//int初始值0,小数初始值0.0,字符类型初始值'\0',bool初始值false,int a[100]
一百个0
//INT_MAX 常量,代表整
数最大的数
//INT_MIN 常量,代表整数
最大的数
stri
ng s;
int s
um;
int ma
in()
{
/*
遍历,转
换,累加
*/
ci
n>>s;
for(int i=0;i<s.size();
i++){
sum += s[i]
-'0
';
}
cout<<sum<<
endl;
retu
rn
0;
}
`
``
`
``
/*
1101 - 【入门】
时间的差!
题目描述
看到两个标准格式的时间,有小时,有分钟,有秒,格式如:h:m:s,即 时:分:秒 你想知道,这两个时间之间相差
多少吗
?
输入
输入包括两行,两行均为一个“时:分:秒”格式的时间。且本题保证第一个时间一定大于第二
个时间
!
输出
输出就是输入的两个时间之间的
秒数差
。
样例
输入复制
01:
10:10
00:
30:30
输出复制
238
0
*/
#include <bits/stdc
++.h>
using namespace
std;
int num(strin
g s){
//02:
20:03
int
r=0;
//将前两个字符截取出来,用10位*10
加上个位
int h = (s[0]-'0')*10 + (s[1]-
'0');
int m = (s[3]-'0')*10 + (s[4]-
'0');
int ss = (s[6]-'0')*10 + (s[7]-
'0
');
r = h*60*60 + m*60
+ ss;
retu
rn r
;
}
int ma
in()
{
/*
1.求字符串距离00:00:
00总秒数
2.相减
*/
string s
1,s2;
cin>>s1
>>
s2;
cout<<num(s1)-num(s2)<<
endl;
retu
rn
0;
}
`
``
/*
1480 - 【基础】找字典码最
小的字符串
题目描述
编写程序,针对输入的N个不同的字符串,输出其中字典码最小的
字符串
。
输入
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,
制表符
。
输出
输出字典码最小
的字符
串
样例
输
入复制
5
Li
Wan
g
Zh
a
Jin
Xian
输出复
制
Ji
n
*/
++.h>
using namespace
std;
//变量定义到main函数外边为全局变量,全局变量在整个程序所有函数中都
可以使用.
//局部变量仅在定义时对应的大括
号内有效
//int初始值0,小数初始值0.0,字符类型初始值'\0',bool初始值false,int a[100]
一百个0
//INT_MAX 常量,代表整
数最大的数
//INT_MIN 常量,代表整数
最大的数
int ma
in()
{
/*
先读一个字符串作为比较字符串,然后以pk的方式找
到最小的
*/
i
nt n;
string s,
min;
ci
n>>n;
cin>
min;
for(int i=1;i i++){
ci
n>>s;
if(s<
min){
m
in=s
;
}
}
cout<<min<<
endl;
retu
rn
0;
}
`
``
/*
1134 - 【基础】
国王的魔镜
题目描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。 给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最
小长度
。
输入
只有一个字符串(长度≤100),由大写英文字母组成,表示最终
的项链
。
输出
只有一个整数,表示国王没使用魔镜前,最初的项链可能的最
小长度
。
样例
输入复制
ABB
AABBA
输
出复制
2
*/
#include <bits/stdc
++.h>
using namespace
std;
bool jingmian(string s,int
end){
bool
flag;
if((end+1)%2 =
= 0){
flag =
true;
for(int i=0;i<=end/2;
i++){
//对称位
置相比较
if(s[i]!=s[end
-i]){
flag=f
alse;
}
}
}el
se
{
flag=f
als
e;
}
return
fl
ag;
}
int ma
in()
{
/*
判断字符串是否可能
接触过镜面
如果可能,裁掉一半,继续判断,直到判断为不可能
接触到镜面
当前长度就是
最小长度
*/
stri
ng s;
ci
n>>s;
int end = s.size()
- 1;
while(jingmian(s,end)==t
rue){
en
d/=
2;
}
cout<<end+1<<
endl;
retu
rn
0;
}
`
``
/*
题目描述
Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的
对应关系。
密文:A B C D E F G H I J K L M N O P Q R S T U V W
X Y Z
明文:V W X Y Z A B C D E F G H I J K L M N O P Q R
S T U
你的任务是对给定的密文进行解密
得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进
行解码
。
输入
一行,给出密文,密文不为空,而且其中的字符数不超过
200
。
输出
输出一行,即密文对应
的明文
。
样例
输入复制
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ H
FZXJX
输出复制
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL C
AUSE
S
*/
++.h>
using namespace
std;
int ma
in()
{
/*
*/
stri
ng s;
getline(ci
n,s);
for(int i=0;i
i++){
if(s[i]>='A' && s[i]<=
'Z'){
//s[i]=(s[i]-'A'-5+26) % 26
+'A'
if(s[i]>='F' && s[i]<='Z') s[i
]-=5;
else s[i]+='V'
-'A'
;
}
}
cout<<s<<
endl;
retu
rn
0;
}
作业题
`
``
/*
1475 - 【入门】
字符串对比
题目描述
给定两个仅由大写字母或小写字母组成的字符串(长度介于1到100之间),它们之间的关系是以下4种情
况之一:
1:两个字符串长度不等。比如 Beijing 和 H
ebei
2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Bei
jing
3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEI
jing
4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nan
jing
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的
编号。
输入
包括两行,每行都是一
个字符
串
输出
仅有一个数字,表明这两个字符串的
关系编号
输入复制
BEI
jing
bei
Jing
输
出复制
3
*/
#include <bits/stdc
++.h>
using namespace
std;
string upstr(strin
g s){
for(int i=0;i<s.size();
i++){
s[i] = toupper(s
[i]
);
}
retu
rn
s;
}
int ma
in()
{
/*
先判断完全
相等的情况
否则判断长
度相等情况
然后统一转化为大写
,再比较
*/
string s
1,s2;
i
nt r;
cin>>s1
>>s2;
if(s1=
=s2){
r
= 2;
}else if (s1.size()==s2.siz
e()){
if(upstr(s1)==upstr(
s2)){
r=3;
}
else{
r=4
;
}
}
else{
r=
1;
}
cout<<r<<
endl;
retu
rn
0;
}
`
``
/*
1478 - 【入门】出现次数最多
的小写字母
题目描述
输入一个由小写字母组成的字符串(字符数量<=100),输出出现次数最多的小
写字母。
注意:如果有多个小写字母出现的次数一样多,则输出ASCII码值最大的那
个字母
。
输入
一
个字符
串
输出
出现次数最多的
小写字
母
样例
输入复制
aaabbbbbbbb
bcdxs
输
出复制
b
*/
++.h>
using namespace
std;
int ma
in()
{
/*
先将每个字符有多少个放
到桶数组中
遍历桶,pk找到
大的就换
*/
stri
ng s;
int max
= 0;
ch
ar c;
int a[150]
={0};
ci
n>>s;
for(int i=0;i
i++){
a[s[i
]]+
+;
}
for(int i=0;i<150;
i++){
if(a[i]>=m
ax) {
max =
a[i];
c
= i;
}
}
cout<<c<<
endl;
retu
rn 0
;
}
`
`
/*
1100 - 【入门
】词组缩写
题目描述
定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写。 比如,C语言里常用的EOF就是end of fil
e的缩
写。
输入
测试数据占一行,有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成; 单词长度不超过10,由一个或多个空格分隔这
些单词
。
输出
输出规
定的缩
写
样例
输入复制
end of
file
输出复
制
EO
F
*/
++.h>
using namespace
std;
string
s;
int ma
in()
{
/*
将字符串最前方加空格,就不用判断
开头的情况
首字母的条件是,当前不是空格,前一
位是空格。
找到首字母后将其转化为
大写即可
*/
getline(ci
n,s);
s = " "
+ s;
for(int i=1;i
i++){
if(s[i] != ' ' && s[i-1] ==
' '){
cout<
i]))
;
}
}
retu
rn
0;
}
`
`
/*
1103 - 【基础】
字符串压缩
题目描述
输入字符串,输出压缩后的字符串。压缩的方法是把连续的相同字母压缩为"长度+字母"的形式,在本题中,单个的字母不需
要压缩
。
输入
一行,一个字符串,只包含小写英文字母,长度不超过
255
。
输出
样例
输入复制
aaab
bbbbx
输出复制
3a5b
x
*/
++.h>
using namespace
std;
strin
g s;
int
c;
int ma
in()
{
/*
遍
历字符串
启
动计数器
判断当前字符是否和后一字符相同,如果不同, 则输出计数器
和当前字符
同时重置计数器,为下一个字
符做准备
*/
getline(ci
n,
s);
for(int i=0;i<s.size();
i++){
c++;
//如果是最后一个连续字母或者是整个字符串最后一位则
开始输出
if(s[i+1] != s[i] || i == s.size(
)-1){
//计数器大于1才
输出数字
if(c>1) cou
t<
cout<
[i];
c
= 0
;
}
}
retu
rn
0;
}
`
`
/*
1012 - 【基础】我是
第几个单词
题目描述
输入一个英文句子,例如:“This is a Book.",可以看到句子是以“.”来作为结束符号的,并且单词之间以一个空格来分隔。接着再输入一个单词A,请找出首次在句子中出现的与A相同的单词,是句子中的第几个单词,若不存在,则输出该句子中单词字符的总个数。 例如对上句子而言,若输入单词“is”,则应输出:2 若输入单词“isa”,则应输
出:1
1
输入
第一行为以‘.’结束的一个词组(仅由若干个单词组成,单词间由一空格隔开,除单词和最后的“.”以外,不含其
它字符)
第二行是一个单词(不
含空格
)
输出
一个整
数
样例
输入复制
This is a
Book.
Book
输
出复制
4
*/
++.h>
using namespace
std;
string s,word,t
emp;
int c,in
dex;
bool flag = fa
lse;
int ma
in()
{
/*
遍
历字符串
使用临时字符串存储当前找到
的单词。
使用计数器记录当
前单词顺序
使用计数器记录
总字符数
使用flag标记
是否
包含
判断当前字符是否为连续的字母,如果下一个字符是空格或者到了结尾,则
进行处理
使用计数器记录当前是第
几个单词
将字符串长度累加到总字
符数中。
判断得到的字符串是不是要找的,如果是,输出当前计数器,并且退出循环,退出之前需
要标记
*/
getline(ci
n,s);
getline(cin,w
or
d);
for(int i=0;i<s.size()-1;
i++){
if(s[i]!=
' '){
temp = temp +
s[i];
//如果是最后一个连续字母或者是整个字符串最后一位则
开始输出
if(s[i+1] == ' ' || s[i+1] ==
'.'){
ind
ex++;
//cout<
endl;
c += temp.si
ze();
if(temp == w
ord){
cout<
ndex;
flag =
true;
b
reak;
}
temp
= "";
}
}
}
if(!f
lag){
cou
t<
;
}
retu
rn
0;
}
`
`
/*
1123 - 【基础】
表达式的值
题目描述
给出一个表达式,其中运算符仅包含+,要求求出表达式
的最终值。
如:1+1,则结果为2,1+2+3则结果为6,12+23则结果
35。
输入
仅一行,即为含有正整数和+号的
表达式
。
输出
仅一行,既为表达式算出的结果(所有数据保证计算结果<=1
09)
。
样例
输入复
制
1+1
输
出复制
2
*/
++.h>
using namespace
std;
string s,t
emp;
int
sum;
bool flag = fa
lse;
int ma
in()
{
/*
遍
历字符串
使用临时字符串存储当前找
到的数字。
使用计数器
记录
总和
判断当前字符是否为连续的数字,如果下一个字符是+或者到了结尾,则
进行处理
使用计数器
累加。
*/
getline(ci
n,
s);
for(int i=0;i<s.size();
i++){
if(s[i]!=
'+'){
temp = temp +
s[i];
//如果是最后一个连续字母或者是整个字符串最后一位则
开始输出
if(s[i+1] == '+' || i==s.size(
)-1){
//cout<
endl;
sum += stoi(t
emp);
temp
= "";
}
}
}
cout<<
sum;
retu
rn
0;
}
`
`
/*
1127 - 【基础】
整数的拼接
题目描述
设有n个整数(3≤n≤100),将这些整数拼接起来,可以形成一个最
大的整数。
例如:n=3,三个整数分别为21 7 34, 拼接后最大的整数为:
73421
再比如:n=3,三个整数分别是1 10 110,拼接后最大的整数是:11
101
0
输入
第一行一个整数n ,表示有n
个整数。
第二行n个整数,数与数之间用一个空
格分隔
。
输出
输出到屏幕 。一个拼接后的最大
的整数
。
样例
输
入复制
3
21
7 34
输出复制
7342
1
*/
++.h>
using namespace
std;
string s[1
10];
in
t n;
bool flag = fa
lse;
bool cmp(string s1,string
s2){
return s1+s2>s
2+s1
;
}
int ma
in()
{
/*
(错误)比较字典序,字典序较大的排前面,所以完成string数组的
排序就行
s
1=10;
s2=1;
s1+s2
=101;
s2+s1
=110;
110
101;
*/
ci
n>>n;
for(int i=0;i
i++){
cin>>
s[i
];
}
sort(s,s+n,
cmp);
for(int i=0;i
i++){
cout<<
s[i
];
}
retu
rn
0;
}
```
g常见函数
查找函数是find(),里面可以是一个字符,也可以是字符串,如果找到返回第一个出
现的位置,
如果找不到返回-1这个是从前
往后查找
截取取子串的函数是:substr(),
形式如下:
s.substr();//返回s
的全部内容
s.substr(11);//从索引1
1往后的子串
s.substr(5,6);//从索引5开始6个字符