1.去重
#include<stdio.h>
#include<string.h>
int main()
{
int visited[26]={0},k=0;
char arr[100],brr[100];
scanf("%s",arr);
for(int i=0;i<strlen(arr);i++)
{
if(visited[arr[i]-'a']==0)
{
brr[k++]=arr[i];
visited[arr[i]-'a']=1;
}
}
printf("%s",brr);
return 0;
}
2.反转
#include<bits/stdc++.h>
using namespace std;
int main()
{
char arr[100];
scanf("%s",arr);
reverse(arr+2,arr+7);
printf("%s",arr);
return 0;
}
测试:
输入: helloworld
输出: heowollrld
3.find
7-108 吃火锅 (15 分)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
string s;
int cnt=0;
vector<int> v;
while(getline(cin, s)&&s != ".")
{
cnt++;
int pos=s.find("chi1 huo3 guo1",0);//从下标为0的位置查找该字符串,返回首次出现该字符串的首位置,若没有找到,则返回-1
if(pos!=-1) v.push_back(cnt);
}
cout<<cnt<<endl;
if(v.size()==0) cout<<"-_-#";
else cout<<v[0]<<" "<<v.size();
return 0;
}
4.索引
适用于字符数组:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s1[110],s2[110];
scanf("%s",s1);
strncpy(s2,s1+2,3);//将s1的3到5位置索引到s2
cout<<s2<<endl;
return 0;
}
测试样例:
输入:
abcdefg
输出:
cde
适用于字符串:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s1;
cin>>s1;
string s2=s1.substr(2,5);//从2开始,长度为5
cout<<s2<<endl;
}
5.字符型转整型
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s[10];
cin>>s;
cout<<3*atoi(s)<<endl;//atoi()字符型转整型
return 0;
}
6.count
#include<iostream>
#include<algorithm>//注意count需要引用这个头文件
using namespace std;
int main()
{
string s;
cin>>s;
int num=count(s.begin(),s.end(),'a');//统计字符串s中a出现的个数,注意:只能统计单个字符
cout<<num<<endl;
return 0;
}
7.插入
#include<iostream>
using namespace std;
int main()
{
string s;
cin>>s;
s.push_back('a');//在字符串尾部插入一个字符
s.insert(s.begin()+1,'b');//在指定位置前插入一个字符
cout<<s<<endl;
return 0;
}
8.拼接
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
s1.append(s2);//或s1.append("内容");
cout<<s1<<endl;
s2+=s1;
cout<<s2<<endl;
return 0;
}
9.删除
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
cin>>s1;
s1.erase(s1.begin()+1,s1.end()-2);
cout<<s1<<endl;
cin>>s2;
s2.erase(3,5);//从第三个字符开始,删除5个
cout<<s2<<endl;
return 0;
}
10.替换
#include<iostream>
using namespace std;
int main()
{
string s1,s2,s3;
cin>>s1;
s1.replace(1,2,3,'*');//将当前字符串从pos索引开始的n个字符,替换成m个字符c
cout<<s1<<endl;
cin>>s2;
s2.replace(2,4,"hello!");//从第二个字符开始,长度为4
cout<<s2<<endl;
cin>>s3;
s3.replace(s3.begin(),s3.begin()+5,"dp");
cout<<s3<<endl;
return 0;
}
11.排序
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s;
cin>>s;
sort(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
12.isalnum
判断一个字符是否是字母或者十进制数字,若为字母或者数字,则返回True(非0值),否者返回False(0)
13.L1-8 估值一亿的AI核心代码 (20 分)
输入:
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
输出:
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
cin >> n;
getchar();
while (n--)
{
string s;
getline(cin, s);
cout << s << endl;
while (s[0] == ' ') s.erase(s.begin());//删除行首空格
while (s[s.length() - 1] == ' ') s.erase(s.end() - 1);//删除行尾空格
for (int i = 0; i<s.length(); i++)
{
if (s[i] == ' ')
{
while (s[i + 1] == ' ') s.erase(s.begin() + i + 1);//删除多余空格
if (!isalnum(s[i+1])) s.erase(s.begin() + i);//删除标点符号前的空格
}
}
for (int i = 0; i<s.length(); i++)
if (s[i] >= 'A'&&s[i] <= 'Z'&&s[i] != 'I') s[i] -= 'A' - 'a';//大写换小写
for (int beg = 0;; beg++)
{
beg = s.find("can you",beg);//从第beg个位置开始找
if (beg == -1)break;
if((!beg||!isalnum(s[beg-1]))&&(beg+7==s.length()||!isalnum(s[beg+7])))//((!beg&&!isalnum(s[beg+7]))||(!isalnum(s[beg-1])&&!isalnum(s[beg+7]))||(beg+7==s.length()&&!isalnum(s[beg-1])))
s.replace(beg,7,"A can");
}
for (int beg = 0;; beg++)
{
beg = s.find("could you", beg);
if (beg == -1)break;
if ((!beg||!isalnum(s[beg-1]))&&(beg+9==s.length()||!isalnum(s[beg+9])))
s.replace(beg,9,"A could");
}
for (int beg = 0;; beg++)
{
beg = s.find("I", beg);
if (beg == -1)break;
if ((!beg||!isalnum(s[beg-1]))&&(beg+1==s.length()||!isalnum(s[beg+1])))
s.replace(beg,1,"you");
}
for (int beg = 0;; beg++)
{
beg = s.find("me", beg);
if (beg == -1)break;
if ((!beg||!isalnum(s[beg-1]))&&(beg+2==s.length()||!isalnum(s[beg+2])))
s.replace(beg,2,"you");
}
for (int i=0; i<s.length(); i++)
{
if (s[i] == '?')s[i] = '!';
if (s[i] == 'A')s[i] = 'I';
}
cout << "AI: " << s << endl;
}
return 0;
}
14.凯撒加密算法
测试样例:
输入:
1
abcdz
123
输出:
bdfeb
题目描述:
凯撒加密算法是有一个字符串和一个数字加密串,我们不断书写数字加密串使之与字符串对齐,然后对应位相加之后即可得到加密的结果。例如,如果给定的字符串是abcdz,而加密串是123的话,那么我们有: abcdz+12312=bdfeb
现在给定字符串s,数字串n,问用n对s进行k次加密操作之后得到的结果是多少。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long k;
char arr[100010],brr[100010],crr[100010];
scanf("%lld",&k);
scanf("%s",arr);
scanf("%s",brr);
int len1=strlen(arr),len2=strlen(brr);
for(int i=0;i<len1;i++)
{
long long s=(k*(brr[i%len2]-'0'))%26;
if('z'-arr[i]>=s)
crr[i]=arr[i]+s;
else
crr[i]='a'-'z'+arr[i]+s-1;
}
printf("%s",crr);
return 0;
}
15. 最短前缀
输入:
carbohydrate
cart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
car
carbonate
输出:
carbohydrate carboh
cart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
#include<iostream>
#include<cstring>
using namespace std;
string s[1010];
int k;
int main()
{
while(cin>>s[k++]);
for(int i=0;i<k;i++)//时间复杂度:20×1000×1000
{
int l=s[i].size();
for(int j=1;j<=l;j++)
{
int cnt=0;
for(int m=0;m<k;m++)
{
if(s[m].substr(0,j)==s[i].substr(0,j)) cnt++;
}
if(j==l) cout<<s[i]<<" "<<s[i].substr(0,j)<<endl;
else if(cnt==1)
{
cout<<s[i]<<" "<<s[i].substr(0,j)<<endl;
break;
}
}
}
return 0;
}