cpp 字符串

文章介绍了如何检测字符串中是否存在只出现一次的字符,并演示了对字符串进行加密处理以及如何将子字符串插入到特定位置。涉及ASCII码的应用和C++编程实现。
摘要由CSDN通过智能技术生成

题目一

给你一个只包含小写字母的字符串。

请你判断是否存在只在字符串中出现过一次的字符。

如果存在,则输出满足条件的字符中位置最靠前的那个。

如果没有,输出 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


 

第二题

在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。

现在给定一个字符串,对其进行加密处理。

加密的规则如下:

  1. 字符串中的小写字母,a加密为 b,b 加密为 c,…,y加密为 z,z 加密为 a。
  2. 字符串中的大写字母,A 加密为 B,B 加密为 C,…,Y 加密为 Z,Z 加密为 A。
  3. 字符串中的其他字符,不作处理。

请你输出加密后的字符串。

输入格式

共一行,包含一个字符串。注意字符串中可能包含空格。

输出格式

输出加密后的字符串。

数据范围

输入字符串的长度不超过 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;
}
  1. while语句的循环输入可以保证当不输入时即退出循环
  2. 只需输出需要的字符串时可以不用记录输出,直接在cout里面改
  • 34
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值