网易题目:
(1)挑出的数字'9','7','0','6'在原串中可以不连续,但是数字的先后顺序不能改变
(2)使用过的数字不能被再次使用
如'123901370997606'可以最多挑出2个'9706',而'6079'则无法挑出任何一个'9706'。
输入
第一行是整数T(T <= 100),表示下面有T组数据。
之后T行,每行为一组数据,每组数据为一个字符串。每个字符串的长度L <= 50000。每个字符串只会包含数字['0'...'9']。
输出
输出T行,每行对应一个数据的输出结果,表示字符串最多能挑出多少个'9706'。
样例输入
4
6097
97069706
997776600069
123901370997606
样例输出
0
2
1
2
算法提示:
读取多行字符串到二维字符数组char str[20][20];
注意读取行数numofst后,需要清除缓存区:
fflush(stdin);
之后再读入字符串;
“9706” 四个数字分别计数存于flagarr[4],
计数值自增的前提是当前数字计数值比前一个计数值小,即 flagarr[n-1] > flagarr[n]
最后只需输出‘6’的计数值即可。
整个算法只需遍历一次字符串即可~
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
int main(){
<span style="white-space:pre"> </span>int i=0,j=0,k=0;
int flagarr[4]={0,0,0,0};
int numofstr=0;
scanf("%d",&numofstr);
char str[20][20];
fflush(stdin);
for(i=0;i<numofstr;i++)
<span style="white-space:pre"> </span>gets(str[i]);
for(i=0;i<numofstr;i++)
{
while(str[i][j]!='\0')
{
switch(str[i][j])
{
case '9': flagarr[0]++; break;
case '7': if(flagarr[0]>flagarr[1]) flagarr[1]++; break;
case '0': if(flagarr[1]>flagarr[2]) flagarr[2]++; break;
case '6': if(flagarr[2]>flagarr[3]) flagarr[3]++; break;
default: break;
}
j++;
}
printf("%d\n",flagarr[3]); //输出结果
j=0;
memset(flagarr, 0, sizeof(int) *4); //数组清零
}
return 0;
}