暑假计算机学习第三天(7.16)

敲了三道字符串模拟题,题目以及代码如下

  (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;
}

需要注意的点是后移需要从数组最后面开始移动,前移需要从数组前面开始时移动

大家共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝学会编程的代码小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值