请找出输入源(比如 input.txt) 中所有符合下面条件的字符
//注释:这个input.txt是一个2k多行的由字母组成的文本文件
1、是一个小写字母,并且,
2、两侧各有 且 只有三个大写字母。
例如:aAAAxAAAa 中的 x
要求及说明:
1、不能使用正则表达式;
2、请尽量优化代码结构和算法性能;
3、能适应更大规模的数据源;
4、请尽量在一小时内完成,最多不能超过两个小时。
改进细节:if (isLowerMatch(pChar)==TRUE && isUpperMatch(pChar)==TRUE)改成if (isUpperMatch(pChar)==TRUE && isLowerMatch(pChar)==TRUE)。isUpperMatch向后比较比isLowerMatch向前比较平均耗时少。
#include "StdAfx.h"
#include <atlstr.h>
#include <iostream>
#include <vector>
using namespace std;
#define NumSize (4096)
vector<char> vectorStr;
vector<char>::iterator iter;
BOOL isLowerMatch(char* pChar)//左边匹配
{
int count=0;
BOOL bThreeLower=FALSE;
if (vectorStr.size()<3)
{
return FALSE;
}
else if (vectorStr.size()==3)
{
iter=vectorStr.end();
do
{
//cout << *(--iter) << endl;
} while(iter!=vectorStr.begin());
}
else//vectorStr.size()>=4
{
iter=vectorStr.end();
do
{
iter--;
count++;
if ( (*iter)>='A' && (*iter)<='Z' )
{
if (count==3)
{
bThreeLower=TRUE;
}
}
if( !((*iter)>='A' && (*iter)<='Z') )
{
if (count==1 || count==2)
{
return FALSE;
}
else if (count==4 && bThreeLower==TRUE)
{
return TRUE;
}
else if (vectorStr.size()==3 && bThreeLower==TRUE)
{
return TRUE;
}
}
//cout << *(--iter) << endl;
} while(iter!=vectorStr.begin());
}
return FALSE;
}
BOOL isUpperMatch(char* pChar)//右边匹配
{
int count=0;
BOOL bThreeUpper=FALSE;
char*temp=pChar;
temp++;
while ((*temp))
{
count++;
if ( (*temp)>='A' && (*temp)<='Z' )
{
if (count==3)
{
bThreeUpper=TRUE;
}
}
if( !((*temp)>='A' && (*temp)<='Z') )
{
if (count==1 || count==2)
{
return FALSE;
}
else if (count==4 && bThreeUpper==TRUE)
{
return TRUE;
}
}
temp++;
}
return FALSE;//右边无字符,直接返回FALSE
}
int main()
{
char* bufFile=new char[NumSize];
memset(bufFile,'\0',NumSize);
FILE* fp=fopen("input.txt","rb");
fread(bufFile,1,NumSize,fp);
//char* pChar=new char[NumSize];
char* pChar=NULL;
pChar=bufFile;
while(*pChar)//注意:while(pChar)出错
{
if ((*pChar)>='a' && (*pChar)<='z')
{
//cout << (*pChar) << endl;
if (isLowerMatch(pChar)==TRUE && isUpperMatch(pChar)==TRUE)
{
cout << *pChar << endl;
}
}
//isLowerCase(pChar);
vectorStr.push_back(*pChar);//前面的字符保存在向量里,用于向前比较;用一个新的字符串保存前面的字符也行
pChar++;
}
cout << bufFile << endl;
delete[] bufFile;
//delete[] pChar;
system("pause");
return 0;
}