/*
* File: aAAAxAAAa.h
* Author: sculley
*
* Created on December 27, 2012, 10:18 AM
*
* 请找出输入文件 (input.txt) 中所有符合下面条件的字符
* 1. 是一个小写字母, 并且,
* 2. 两侧各有且只有三个大写字母.
* 例如: aAAAxAAAa 中的 x
* 要求及说明:
* 1. 不能使用正则表达式;
* 2. 请尽量优化代码结构和算法性能;
* 3. 能适应更大规模的数据源(input.txt);
* 提示:
* 1. 输出的结果是有语义的字符串.
*
* URL: http://www.oschina.net/code/snippet_192190_16605
*/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
/*
* 匹配函数,逐个字符比对
* 匹配时返回值为10,11,
* 不匹配时返回值为1~9,表示不匹配的字符位置
*
* array_point 主串的匹配位置
* j 子串的匹配位置
* add_on 默认为0,表示aAAAxAAAa_test的上一次返回值为1~9;如果返回值为10,11时add_on传入的值为1
* array_start 文本映射到内存后在内存中的起始位置
* array_length 文本长度 byte
*/
int aAAAxAAAa_test(char *array_point, int j, int add_on, char *array_start, long array_length)
{
switch(j)
{
case 0:
if(islower(*(array_point)))
;
else
return 1;
case 1:
if(isupper(*(array_point+1)))
;
else
return 2;
case 2:
if(isupper(*(array_point+2)))
;
else
return 3;
case 3:
if(isupper(*(array_point+3)))
;
else
return 4;
case 4:
if(islower(*(array_point+4)))
{
if(add_on == 1)
{
//考虑aAAAxAAAaAAA的情况,x确认匹配后则第二个a很可能也符合规则,此时,add_on=1,j=1只匹配三个字符即确认匹配
return 11;
}
}
else
return 5;
case 5:
if(isupper(*(array_point+5)))
;
else
return 6;
case 6:
if(isupper(*(array_point+6)))
;
else
return 7;
case 7:
if(isupper(*(array_point+7)))
;
else
return 8;
case 8:
//行尾和文件结尾的处理
if(islower(*(array_point+8)) || (*(array_point+8) == '\r' && *(array_point+9) == '\n') || array_point+8 == array_start+array_length)
;
else
return 9;
}
return 10;
}
/*
* 匹配结果的处理
*
* array_test 文本映射到内存后在内存中的起始位置
* test_file_length 文本长度 byte
* yes 匹配字符的存储内存指针
*/
int aAAAxAAAa_result(char *array_test, long test_file_length, char *yes)
{
char *array_test_start;
array_test_start = array_test;
char *yes_start;
yes_start = yes;
int j = 0;
int add_on = 0;
/*
* 开始8个字符就满足规则的情况
*/
if(isupper(*array_test) && isupper(*(array_test+1)) && isupper(*(array_test+2)) && islower(*(array_test+3)) && \
isupper(*(array_test+4)) && isupper(*(array_test+5)) && isupper(*(array_test+6)) && islower(*(array_test+7)))
{
*yes = *(array_test+3);
yes = yes+1;
array_test = array_test+8;
j = 1;
}
/*
* 一般情况
*/
for(; array_test < array_test_start+test_file_length;)
{
int test_result = aAAAxAAAa_test(array_test, j, add_on, array_test_start, test_file_length);
switch(test_result)
{
case 1:
array_test = array_test+1;
j = 0;
add_on = 0;
continue;
case 2:
array_test = array_test+1;
j = 1;
add_on = 0;
continue;
case 3:
array_test = array_test+1;
j = 1;
add_on = 0;
continue;
case 4:
array_test = array_test+1;
j = 1;
add_on = 0;
continue;
case 5:
array_test = array_test+1;
j = 0;
add_on = 0;
continue;
case 6:
array_test = array_test+1;
j = 1;
add_on = 0;
continue;
case 7:
array_test = array_test+1;
j = 1;
add_on = 0;
continue;
case 8:
array_test = array_test+1;
j = 1;
add_on = 0;
continue;
case 9:
array_test = array_test+1;
j = 0;
add_on = 0;
continue;
case 10:
*yes = *(array_test+4);
yes = yes+1;
array_test = array_test+9;
j = 1;
add_on = 1;
continue;
case 11:
*yes = *(array_test-1);
yes = yes+1;
array_test = array_test+4;
j = 1;
add_on = 1;
continue;
}
}
}
http://www.oschina.net/code/snippet_192190_16605?p=3#comments solu的另一种解法,将所有的大写字符替换为1,然后将两边都是3的字符取出即是答案。另外脚本语言写短的代码的确省事儿多了,容易抽象!