周赛题目小结及分析(第四题:QAQ)

这篇博客介绍了如何通过C++编程解决一个有趣的字符串问题:给定一段英文,计算其中能组成'QAQ'模式的字母组合数量。博主提供了两种不同的代码实现思路,分别通过构建新数组和直接在原字符串中查找,计算每个'A'左右两侧'Q'的个数并相乘,最后将所有结果相加得出答案。文章旨在帮助读者理解和应用这种问题解决方法。
摘要由CSDN通过智能技术生成

大家好!又见面了,这道题很有意思,希望大家能学会这道题的思想,并能学以致用。上题:

 

 这道题的意思就是输入一段英文,然后找出有多少字母能组成“QAQ”特别注意的是,并不是连在一起的才算,就算是隔着字母也能算,换句话说,就是算出“A”左右两边的“Q”的个数,然后相乘。

这里提供两个思路:

  1. 首先将输入的英文里面的"Q"和“A”找出来,组成一个新的数组,顺序不变,然后在这个数组里面找出每个“A”左右两边“Q”的个数,进行计算,然后相加,输出最终的结果。
  2. 不用转换,直接在原英文里面找,原理一样,运用循环来找到“Q”“A”,同样可以实现。

好了,大致的原理就是这样,那么怎么实现呢,接下来看一下代码:

#include<bits/stdc++.h>
using namespace std;
long long b[1000000]={0},c[1000000]={0};
char s[1000000]={0};
char a[1000000]{0};

int main()
{
	scanf("%s",s);//输入的英文
	int i,k=0,l,x=0,j=0,y=0;
	l=strlen(s);//这里计算有多少个字母
	for(i=0;i<l;i++)
	{
		if(s[i]=='Q'||s[i]=='A')
		{
		a[k]=s[i];
		k++;
		}
	}
	
	for(i=0;i<k;i++)
	{
		if(a[i]=='Q')
		{
		x++;
		}
		else
		{
		b[++j]=x;
		}
	}//这里是从左往右的扫描,计算每个“A”左边的“Q”的个数
	int cnt=j;
	for(i=k-1;i>=0;i--)
	{
		if(a[i]=='Q')
		{
			y++;
		}
			else
			{
				c[cnt--]=y;
			}
	}//这里则是从右往左扫描,计算右边的个数
	long long ans=0;
	for(i=1;i<=k;i++)
	{
		ans=ans+b[i]*c[i];//这里将每个“A”所得到的“QAQ”个数进行相加
	}
	printf("%lld\n",ans);
	return 0;
}

上面的是第一个思路,希望能够帮助大家理解。

想了想,我把第二个的思路的代码也写出来:

#include<bits/stdc++.h>
  using namespace std;
int main()
{

char s[101];
	int i, j, k, a, x, y, z;                              
	z = 0;
    cin>>s;
    a = strlen(s); //这里用来计算里面有多少个字母                           
    for(i =0; i <a; i++)                  
    {
    		x = 0;
			y = 0;//这里有个重点,这里每次循环需要把数据清零,不然会带着上次的数据一起算
    	if(s[i] == 'A')
    	{
    		for(j =0; j <i; j++)
    		{
    			if(s[j] == 'Q')
    			x++;//这里计算左边的个数
			}
			for(k =i; k <a; k++)
			{
				if(s[k] == 'Q')
				y++;这里计算右边的个数
			}
			z += x*y;这里计算每个“A”能组成的“QAQ”的个数
		}
	}
	printf("%d", z);
	return 0;
}

好了,这个题到这里就结束了,希望大家都能有所收获,感谢大家的观看!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值