给出一个由O和X组成的串(长度为1~80),统计得分。每个O的分数为目前连续出现的O的个数,X的得分为0。例如,OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3。
方案1
思路:在这个方法中,如果一个字母为O判断下一个是不是也是O。如果都是O,那么就a[i]就是累加,不是的话,就为1
#include<iostream>
#include<cstring>
using namespace std;
const int n = 85;
int main()
{
string s;
cin >> s;
int sum = 0;
int a[n];
memset(a, 0, sizeof(a));
for(int i = 0 ; i < s.length() ; i++)
{
if(s[i] == 'O' && s[i - 1] != 'O')
a[i] = 1;
if(s[i] == 'O' && s[i - 1] == 'O')
a[i] = a[i - 1] + 1;
}
for(int i = 0 ; i < s.length() ;i++)
sum += a[i];
cout << sum << endl;
return 0;
}*/
方案2
思路:使用for循环对输入的字符串进行遍历,维护一个已经连续出现的‘O’的个数的计数器cnt以及串的得分和sum。初始值cnt = 0,sum = 0 。如果遇到’O’就++cnt,然后把cnt加到sum中,如果遇到‘X’就重置cnt为0
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int T;
char buf[128];
scanf("%d\n",&T);
while(T--)
{
gets(buf);
int cnt = 0 , sum = 0, sz = strlen(buf),i;
for(int i = 0 ; i < sz;i++)
{
if(buf[i] == 'O')
sum += (++cnt);
else cnt = 0;
}
cout << sum << endl;
}
}
回顾题目,又写一遍啦!
思路:如果是O就累加,cnt累加,如果遇到X就将cnt置为1;不遇到X就一直累加下去,也就是第一个思路的改进版
#include<iostream>
using namespace std;
int main()
{
string s;
cin >> s;
int sum = 0;//和
int cnt = 1;//计数器
for(int i = 0 ; i < s.length() ; i++)
{
if(s[i] == 'O')
{
sum += cnt;
cnt++;
}
if(s[i] == 'X')
cnt = 1;
}
cout << sum << endl;
}