字符串入门级刷题笔记【自用】

本文是一篇关于编程刷题的笔记,涵盖了字符串大小写转换、凯撒密码实现、素数判断、口算练习题的解法,以及标题字符统计、字符串操作和PASCAL语言代码解析等算法问题。通过实例代码详细阐述了解题思路和方法。
摘要由CSDN通过智能技术生成

提示:自用刷题笔记记录,洛谷字符串题单入门级刷题


1.字符串大写转小写

for(i=0;i<str.length();i++){
  	if(str[i]>=97&&str[i]<=122){
  		str[i]-=32; }  }

2.凯撒密码

字符串中的每个字母向后移动n位

for(i=0;i<str.length();i++){
  		temp=(int)str[i];
		temp=(temp+n)%122;
		if(temp<97&&temp>0)temp+=96;//除余之后小于了a的ASC码
		if(temp==0)temp+=122;//刚好为最后一个z的ASC码被漏算
		str[i]=temp;
  }

3.素数的判断

int prim(int num){
	if(num<=1)return -1;
	int i;
	for(i=2;i*i<=num;i++){
		if(num%i==0)return -1;
	}
	return 1; }

4.口算练习题

a 加法,b减法,c乘法。每一行输入a 11 22表示11和22相加,如果某一行只输入了两个数据则表示与前一个算式相同符号。算式的下一行输出字符的总数。

int len(int number){//计算个数
	int x=0;
	if(number==0) return 1;
	if(number>0){
		while(number){
			number/=10;
			x++;
		}
	}
	if(number<0){//负数的时候
			x=1;
			number=-number;//转为正数进行计算字符个数
			while(number){
				number/=10;
				x++;
			}
	}
	return x;
}
int main()
{
	int flag,a,b;
	int n;
	cin>>n;
	int i;
	string s; 
	for(i=0;i<n;i++){
	cin>>s;//遇到第一个空格即为结束
  	int x;
  	switch(s[0]){
  		case 'a':cin>>a>>b;
  		         printf("%d+%d=%d\n",a,b,a+b);
  		         x=len(a+b)+2;
  		         flag=s[0];break;
  		case 'b':cin>>a>>b;
  		         printf("%d-%d=%d\n",a,b,a-b);
  		         x=len(a-b)+2;
  		         flag=s[0];break;
  		case 'c':cin>>a>>b;
  		         printf("%d*%d=%d\n",a,b,a*b);
  		         x=len(a*b)+2;
  		         flag=s[0];break;
  		default://表示第一个字符串不是abc,而是一个数(即为数据a)
		  cin>>b;
		  a=0;
		  int le=s.size();
		  for(int j=0;j<le;j++)a=a*10+s[j]-'0';	//将字符串转为数字	
		  switch(flag){//第一个不是abc则表示与上一个算式的符号一致,所以使用flag
		  	case 'a':
			     printf("%d+%d=%d\n",a,b,a+b);
  		         x=len(a+b)+2;
  		         break;
  		    case 'b':
  		         printf("%d-%d=%d\n",a,b,a-b);
  		         x=len(a-b)+2;
  		         break;
  	    	case 'c':
  		         printf("%d*%d=%d\n",a,b,a*b);
  		         x=len(a*b)+2;
  		         break;
		  	default:break;
		  } break;
	  }	
	x=len(a)+len(b)+x;
	printf("%d\n",x);
	}
  return 0;
}

5. 标题统计字符

统计标题字符数,不计算空格、回车。输入一个字符串,输出字符个数

#include <iostream>
using namespace std;
#include<string>
int main()
{
  string s;
  int num=0;
  int i;
  getline(cin,s);//可以读取空格,但不读取回车
  for(i=0;i<s.length();i++){
  	if(s[i]==' ') continue;//不计算空格的个数
  	num++;
  }
  cout<<num;
  return 0;
}
string x; 
scanf("%s",x);//不读取空格,不读取回车 
gets(x);//读取空格,读取回车 
cin>>x;//不读取空格, 不读取回车
getline(cin,x);//读取空格,不读取回车 
char ch;
cin>>ch;//不读取回车
scanf("%c",&ch);//读取回车

6.字符串的相关操作

  string s1;
  string s2;
  int a,b,ans;
  for(i=0;i<num;i++){
  	cin>>op;
  	switch(op){
  		case 1:cin>>s2;s1=s1+s2;cout<<s1<<endl;//添加字符串
  			break;
  		case 2:cin>>a>>b;s1=s1.substr(a,b);cout<<s1<<endl;//变为子串
  			break;
  		case 3:cin>>a>>s2;s1=s1.insert(a,s2);cout<<s1<<endl;//在字符串后添加串
  			break;
  		case 4:cin>>s2;
  		    if(s1.find(s2)!=string::npos){//查找子串,注意string::npos
  		    	cout<<s1.find(s2)<<endl;
			  }else{
			  	cout<<"-1"<<endl;
			  }
  			break;
  		default:break;
	  }	
  }

ps:switch case多个条件使用同一种算法的话可以这样

case 1:
case 2:
case 3:
     xxxxxx;
     break;

7.统计单词数目

不区分大小写,输出给定单词在字符串中出现的次数以及第一次出现的位置
如:to to be or not to be is a question 输出:2 0

int main()
{
  string s1,s2;//定义两个字符串,s1是给定的单词,s2是给定的字符串
  getline(cin,s1);//调用getline直接读入一整行
  getline(cin,s2);
  int i;
  for(i=0;i<s1.length();i++){//将两个字符串都转为小写
  	s1[i]=tolower(s1[i]);
  }
  for(i=0;i<s2.length();i++){
  	s2[i]=tolower(s2[i]);
  }
  //因为连起来的不算,所以要在前后加几个空格,一定是同样多的,同量减去同量等于同量
  //不在前面加空格的话,比如查找u这个单词,刚开始的hui这个单词里的u就被认为是u单词,所以需要在前面加空格
  s1=' '+s1+' ';
  s2=' '+s2+' ';
  //首先先进行查找,查看是否能找到,第一次找不到即为-1
  if(s2.find(s1)==string::npos){
  	cout<<-1<<endl;
  }else{//找到一个以后继续查找
  	int alpha=s2.find(s1);//记录第一次查找的起始位置
  	int beta=s2.find(s1),s=0;//beta为后面几次查找的起始位置,s为单词出现次数的计数器
  	while(beta!=string::npos){//当beta仍然找得到的时候
  		s++;//计数器加1
  		beta=s2.find(s1,beta+1);//从beta+1索引位置又开始查找子串,前面已经计数就不管了 
	  }
	  cout<<s<<" "<<alpha<<endl;//s为计数个数,alpha为第一次出现的位置
  }
  return 0;
}

8.honoka

输入一个只有VK的字符串,在只能修改一个字符的情况下,问最多出现多少个VK

int main()
{ 
  int n,ans=0,i;//ans为计数器 
  string s;
  cin>>n;//s的长度 
  cin>>s;//字符串 
  for(i=0;i<n-1;i++){
  	if(s[i]=='V'&&s[i+1]=='K'){//第一类:VK连在一起的时候 
  		ans++;
  		s[i]='v';//已经符合了的就标记为已符合,注意两个标记的不能相同 
  		s[i+1]='k';
	  }
  }
  for(i=0;i<n-1;i++){//第二类:VV或者KK,只需修改一个字符即可符合要求 
  	if(s[i+1]==s[i]){
  		ans++;
  		cout<<ans;//至多修改一次,后面都不能再进行修改
  		return 0;//直接就可以结束程序 
	  }
  }//没有相邻的就直接输出原来的数 
  cout<<ans;
  return 0;
}

9.单词覆盖还原

一个字符串被反复贴有

  string s;
  getline(cin,s);
  int i;
  int ansboy=0;
  int ansgirl=0;
  for(i=0;i<s.length()-2;i++){
  	if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y')ansboy++;
  }
  for(i=0;i<s.length()-3;i++){
  	if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+3]=='l')ansgirl++;
  }
//  cout<<ansboy<<endl;
//  cout<<ansgirl<<endl;
// 上列的输出可以转换为
cout<<ansboy<<endl<<ansgirl;

10.USACO

两个字符串名字的每个字母转为数字(A-1 B-2 C-3 D-4…)然后乘积mod47后两个结果一致则输出go,不一致则输出stay

  int num1=1,num2=1;//一定要对变量进行初始化操作,不然就会随机分配0 1
  for(int i=0;i<s1.length();i++){
  	num1=(num1*((int)s1[i]-64))%47;
  }
   for(int i=0;i<s2.length();i++){
  	num2=(num2*((int)s2[i]-64))%47;
  }
  if(num1==num2)cout<<"GO";
  if(num1!=num2)cout<<"STAY";

11.语句解析

一串长度不超过255的PASCAL语言代码,只有abc三个变量,且只有赋值语句,赋值只能是一个一位的数字或者变量,每条赋值语句的格式为变量:=变量或者一个变量; 未赋值的变量值为0,输出ABC的值

#include <iostream>
using namespace std;
#include<string>
#include<map>
int main()
{ 
  string s;
  cin>>s;
  map<char,int> mp;//此处使用了map的映射,即可免去了字符转int的类型转换
  mp['a']=0;mp['b']=0;mp['c']=0;//初始化未赋值的变量为0
  int i;
  for(i=3;i<s.length();i=i+5){//PASCAL语言代码的下标为3即为赋值
  	if(s[i]<58&&s[i]>47){//表示赋值的是一个数值
  		int num=(int)s[i]-48;//将字符型的数字转为int型的数字
  		mp[s[i-3]]=num;//完成变量的赋值,即完成mp['a']=赋值
	  }else{
	  	mp[s[i-3]]=mp[s[i]];//完成变量的赋值是一个变量的情况
	  }
  }
  cout<<mp['a']<<" "<<mp['b']<<" "<<mp['c']<<endl;//输出每一个变量的赋值
  return 0;
}

结束语

浅浅记录刷题的一些关键代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值