一道华为上机题

/*
题目概述:请设计函数,检测输入字符串中是否包含连续的或者离散的
test,test只出现一次。

函数原型:int getTest(char input[]) 

函数说明:input为输入的字符串,如果出现连续的test则返
回1,如果出现离散的test则返回2,如果没有出现test或者
出现的次数和顺序不正确,则返回0

测试样例:

char in[][30]=
{
"avvvdtestdkd",
"atvvdedskt",
"tshihitesst",
"testabctesst",
"testabcst",
"tshihitesst"
};

in[0]= avvvdtestdkd       getTest(in[0])= 1
in[1]= atvvdedskt         getTest(in[1])= 2
in[2]= tshihitesst        getTest(in[2])= 0
in[3]= testabctesst       getTest(in[3])= 0
in[4]= testabcst          getTest(in[4])= 0
in[5]= tshihitesst        getTest(in[5])= 0
*/
#include <iostream>
#include <assert.h>
using namespace std;

int getTest(char input[])
{
	assert(input);
	int position[4];
	int flag[26] = {0};
	char pattern[] = "test";
	int i = 0, j = 0, count = 0;
	char *p1 = input;
	while (*p1!='\0') {
		if (*p1=='t')
			++count;
		++p1;
	}
	if (count!=2)
		return 0;

	char *p2 = input;
	count = 0;
	bool begin = false;
	while (*p2!='\0') {
		if (*p2=='t') 
			++count;
		if (count==1)
			begin = true;	
		else
			begin = false;
		if (begin) {
			switch (*p2-'a') {
				case 't'-'a':
					++flag['t'-'a'];
					break;
				case 'e'-'a':
					++flag['e'-'a'];
					break;
				case 's'-'a':
					++flag['s'-'a'];
					break;
				default:
					break;
			}
		} 
		++p2;	
	}

	if (flag['e'-'a']>1 || flag['s'-'a']>1)
		return 0;
	memset(flag, 0, 26*sizeof(int));

	char *p3 = input;
	int k = 0;
	while (*p3!='\0') {
		if (*p3==pattern[j]) {
			position[k++] = i;			
			++j;
		}	
		++i;
		++p3;
	}
	
	if (position[3]-position[2]==1 && position[2]-position[1]==1 &&
		position[1]-position[0]==1)
		return 1;
	else
		return 2;

}

int main(int argc, char **argv)
{
	char in[][30]=
	{
		"qtestwerssees",
		"atvvdedskt",
		"tshihitesst",
		"testabctesst",
		"testabcst",
		"tshihitesst"
	};
	for (int i=0; i<6; ++i) {
		cout<<getTest(in[i])<<endl;
	}

	system("pause");
	return 0;
}
若字符串中出现1个t或者3,4,5...个t都是不符合条件的,返回0;若是出现两个t就统计两个t中间e和s出现的次数,次数大于1次的也不符合条件返回0。把上面两种情况去掉以后就可以分析test是连续还是离散的了~
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值