题目一
给你一个只包含小写字母的字符串。
请你判断是否存在只在字符串中出现过一次的字符。
如果存在,则输出满足条件的字符中位置最靠前的那个。
如果没有,输出 no
。
输入格式
共一行,包含一个由小写字母构成的字符串。
数据保证字符串的长度不超过 100000100000。
输出格式
输出满足条件的第一个字符。
如果没有,则输出 no
。
输入样例:
abceabcd
输出样例:
e
先贴代码
#include<iostream>
#include<cstring>//注意strlen()需要
#include<cstdio>
using namespace std;
char str[100010];
int num[26];
int main(){
cin>>str;
int len = strlen(str);
for(int i = 0;str[i];i++){//对于字符串数组牢记最后一位'/0',当读取到'/0'时自动停止
num[str[i]-'a']++;//ASCII码当中a,b,c,d....连续,可以用此方法确定数组位号
}
for(int i = 0;str[i];i++){
if(num[str[i]-'a']==1){
cout<<str[i]<<endl;
return 0;
}
}
puts("no");
return 0;
}
基础是char数组或者String类型的输入输出,循环遍历,字符串最后一位是'/0'牢记
可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个'\0'字符,因此字符数组的长度至少要比字符串的长度多 1!
输入方法
cin>>str[];
scanf("%s",str);
scanf("%s",&str[]);
特别注意不带空格的字符串常用cin和scanf,但带空格的字符串需要考虑利用函数进行输入
fgets(str,MAXNUM,stdin);//MAXNUM指的是这个字符串允许输入的最多字符数,stdin保持,指的是把终端当作文件来读入
//--------------------------------------------------------------------------------------//
char str[100];
cin.getline(str,100);//只对char型数组,100指的是最多读入100个字符
//--------------------------------------------------------------------------------------//
string str;//string不是基本数据类型
getline(cin,str);//只对string字符串,cin输入
输出方法
puts(str);
cout<<str<<endl;
printf("%s",str);
开始第二题之前需要学会使用string字符串,常用的是这个。
String标准库
#include<string>
便捷初始化
string S1;
string S2 = S1;
string S3 = "haya";
string S4(10,'c');//输出S4为cccccccccc
便捷输入输出
string s1,s2;
cin>>s1>>s2;//可以用cin输入但是不能用scanf输入,否则会报错
cout<<s1<<' '<<s2;
//或者
puts(s1,s2);
特别注意如果需要使用printf进行输出string的话
printf("%s\n",s1.c_str())//一定要这样写
便捷增加后续,string类型的相加即串在后面
string s3 = "asdaf"
S3 += "is great";//输出结果是asdaf is great
S3.size();//int型,S3的长度
S3.empty();//bull型,S3是否为空
string型的遍历
string s = "Hello World";
for(int i = 0;i < s.size();i++){
cout<<s[i]<<endl;
}
return 0;
但是对于string类型,有更便捷的遍历方法
string s = "Hello World";
for(char c : s) cout << s << endl; //c相当于把s中的字符赋值上
但如果相对string类型的s进行更改即利用c进行更改,那么必须注意一下语法
srting s;
for(char &c : s){//这里可以是for(auto &c : s),编译器会自动识别数据类型
c = 'a';
}
//等价于以下-----------------------------------------------------------------//
for(int i = 0; i<s.size();i++){
char &c = s[i];
c = 'a';
}
//将会把string类型s全部置为a
第二题
在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。
现在给定一个字符串,对其进行加密处理。
加密的规则如下:
- 字符串中的小写字母,a加密为 b,b 加密为 c,…,y加密为 z,z 加密为 a。
- 字符串中的大写字母,A 加密为 B,B 加密为 C,…,Y 加密为 Z,Z 加密为 A。
- 字符串中的其他字符,不作处理。
请你输出加密后的字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出加密后的字符串。
数据范围
输入字符串的长度不超过 100100。
输入样例:
Hello! How are you!
输出样例:
Ifmmp! Ipx bsf zpv!
贴代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string str;
int main(){
getline(cin,str);
for(auto &c:str){
if(c>='a'&& c<='z'){
c = (c-'a' + 1) % 26 + 'a';
}
else if(c>='A' && c<='Z'){
c = (c-'A' + 1) % 26 + 'A';
}
}
cout<<str<<endl;
return 0;
}
对于每一个字符来说都是一个ASCII码,相隔1,循环遍历一定需要注意 在c前取地址符保证是对s进行修改操作,对于string类型来说要看做是一个char型数组,对c的改变就是对char str[i]的改变
第三题
两个不包含空白字符的字符串 str 和 substr,str的字符个数不超过 1010,substr 的字符个数为 33。(字符个数不包括字符串结尾处的 \0
。)
将 substr插入到 str 中 ASCII 码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式
输入包括若干行,每一行为一组测试数据,格式为
str substr
输出格式
对于每一组测试数据,输出插入之后的字符串。
输入样例:
abcab eee
12343 555
输出样例:
abceeeab
12345553
需要记住函数substr(START,LENGTH)和插入函数s.insert(START,SUBSTR)
a.substr(start,length)//输出a.substr将会输出送start到a字符串的length长度
a.insert(start,substr)//将substr字串插入到a字符串的start位置
贴代码
#include <iostream>
using namespace std;
int main()
{
string a,b;
while(cin>>a>>b){
int idx = 0;
for(int i = 1;i<a.size();i++){
if(a[i]>a[idx]){
idx = i;
}
}
cout<<a.substr(0,idx+1)+b+a.substr(idx+1)<<endl;
}
return 0;
}
- while语句的循环输入可以保证当不输入时即退出循环
- 只需输出需要的字符串时可以不用记录输出,直接在cout里面改