输出文件字符序列中两侧各有且只有三个大写字母的小写字母的C++实现源代码

请找出输入源(比如 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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值