敲了三道字符串模拟题,题目以及代码如下
(287串的处理)
#include<bits/stdc++.h>
using namespace std;
void change(char &ch){ //改成大写
if(ch>='a'&&ch<='z')
{
ch-=32;
}
}
bool isNum(char ch){ //判断是否是数字
if(ch>='0'&&ch<='9')
{
return true;
}return false;
}
bool isChar(char ch){ //判断是否是字母
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
return true;
}return false;
}
int main()
{
string str;
getline(cin,str);
change(str[0]);
for(int i=0,j=1;i<str.size();i++,j++) //双指针做法
{
if(str[i]==' '&&j<str.size())
{
if(str[j]==' ')continue;
else {
cout<<str[i];
change(str[j]);
}
}else if((isNum(str[i])&&isChar(str[j]))||(isNum(str[j])&&isChar(str[i])))
{
cout<<str[i]<<"_";
}else cout<<str[i];
}
return 0;
}
思路:考虑用双指针的做法,通过str[i]和str[j]的情况来具体分析,三个基础的函数,小写转大写,判断是否是数字,字母可以很大程度上提供便利
(138密文搜索)
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<string,int>mp;
string str,s;
cin>>str;
int n;cin>>n;
while(n--)
{
cin>>s;
sort(s.begin(),s.end(),less<int>());
mp[s]++;
}
int ans=0;
for(int i=0;i<=str.size()-8;i++)
{
string t = str.substr(i, 8);
sort(t.begin(),t.end(),less<int>());
ans+=mp[t];
}
cout<<ans;
return 0;
}
思路:看懂题意是关键,因为密码可以随机排列(全排列),故只要密码各个字母出现的次数与原字符串某连续8位各个字母出现的次数相同就代表一个答案,使用sort函数排序字符串,再传进map关联容器中,把排好的字符串当成key,value就是1,最后再遍历str字符串,答案次数就是加上与map的key相同的value
通过这道题学一下substr()函数的用法
string str="0123456789";
string sub1=str.substr(5); //只有一个数字5,表示从下标5开始一直到结束:sub1="56789"
string sub2=str.substr(5,3); //表示从下标5开始截取长度为3位:sub2="567"
(63字符串中第一个只出现一次的字符)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
getline(cin,str);
map<char,int>mp{
{'a',0},
{'b',0},
{'c',0},
{'d',0},
{'e',0},
{'f',0},
{'g',0},
{'h',0},
{'i',0},
{'j',0},
{'k',0},
{'l',0},
{'m',0},
{'n',0},
{'o',0},
{'p',0},
{'q',0},
{'r',0},
{'s',0},
{'t',0},
{'u',0},
{'v',0},
{'w',0},
{'x',0},
{'y',0},
{'z',0}
};
for(int i=0;i<str.size();i++)
{
mp[str[i]]++;
}
bool found=false;
for(int i=0;i<str.size();i++)
{
if(mp[str[i]]==1)
{
cout<<str[i];
found=true;
break;
}
}
if(found==false)
{
cout<<"#";
}
return 0;
}
这道题相比前两道稍微容易一点,注意一些细节就可以(第一个只出现一次的字符)
晚上学了顺序表的插入和删除操作
插入操作
bool(SqList &L,int i,int e){
if(i<1||i>L.length+1) //判断i的范围是否有效
return false;
if(L.length>=MaxSize) //当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--) //第i的元素及之后的元素后移
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return true;
}
删除操作
bool ListDelet(SqList &L,int i,int &e){
if(i<1||i>length)
return false;
e=L.data[i-1]; //将被删除的元素赋值给e
for(int j=i;j<L.length;j++) //前移
L.data[j-1]=L.data[j];
L.length--;
return true;
}
需要注意的点是后移需要从数组最后面开始移动,前移需要从数组前面开始时移动
大家共勉!