大家好!又见面了,这道题很有意思,希望大家能学会这道题的思想,并能学以致用。上题:
这道题的意思就是输入一段英文,然后找出有多少字母能组成“QAQ”,特别注意的是,并不是连在一起的才算,就算是隔着字母也能算,换句话说,就是算出“A”左右两边的“Q”的个数,然后相乘。
这里提供两个思路:
- 首先将输入的英文里面的"Q"和“A”找出来,组成一个新的数组,顺序不变,然后在这个数组里面找出每个“A”左右两边“Q”的个数,进行计算,然后相加,输出最终的结果。
- 不用转换,直接在原英文里面找,原理一样,运用循环来找到“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;
}
好了,这个题到这里就结束了,希望大家都能有所收获,感谢大家的观看!