设为首页 收藏本站
查看: 1134|回复: 0

[经验分享] 华为机试——含有通配符的字串匹配

[复制链接]

尚未签到

发表于 2016-6-7 03:17:58 | 显示全部楼层 |阅读模式
   今天去华为参加暑期实习生机试,一共三个题目,前面两个较为简单(二选一)。1、给定一个日期(如2012年4月15日),判断是周几?2、把一个字符串中的非字母删掉,并且将大写字母小写。3、求一个字符串2在字符串1中的最先匹配,字符串2中可以使用通配符*,即*可以代替任意字符。例如,str1[]="abcdefgh";str2[]="a*f";则输出结果是“abcdef”.
   第三个题目是选作题目,监考的帅哥一再提醒我们,最好做一下第三个题目,感觉第三个题目,对我来说的确有点复杂。我在机试现场写的程序是错误的,到了快结束的时候,才把思路理清楚。晚上回到实验室之后,花了将近2个小时的时间,才把程序按照思路写出来,且没有考虑算法的时间复杂度。下面把我的思路以及代码放在下面,希望大家多多批评指教。
   思路:若str2是普通字符串,即不含有通配符*,则只要有两重循环就可以求得最先匹配。现在,str2中可以使用通配符“*”,也就是说,我们在使用普通的算法的时候,只要把*的作用给考虑进去,那么问题就引刃而解了。代码如下所示,代码中的测试用例都可以正确的求解。
  

/*查找字符串2在字符串1中的最先匹配,字符串2中可以使用通配符
例如、str1="abcedfgh";str2="a*f";则结果为"abcdef"
*/
#include <stdio.h>
#include <string.h>

void FindMatch(char *pszIn,char *pszKey,char *pszOut){
//*********************************************
int i=0,j=0,start=0,end=0;
int len1=strlen(pszIn),len2=strlen(pszKey);
int find=0;

for(start=0;start<len1;start++){
i=start;
for(j=0;j<len2 && i<len1;j++){
if(pszIn!=pszKey[j] && pszKey[j]!='*')//本次匹配失败,从pszIn的下一个字符重新开始比较
break;
else if(pszIn==pszKey[j] && pszKey[j]!='*'){//当前位置的字符相等,比较下一个位置的
i++;
if(j==len2-1){
find=1;
end=i;
}
}else if(pszKey[j]=='*'){//查找pszIn中从i位开始,到结束是否存在pszKey[j+1]

if(j+1>len2-1){//pszKey[j]是最后一个元素
end=i;
find=1;
break;
}else if(pszKey[j+1]=='*')
continue;
else{//pszKey[j+1]是正常字母,在pszIn中从i位开始查找,若找到则继续比较下一位;否则,一定不会匹配
for(;i<len1;i++)
if(pszIn==pszKey[j+1]){
j++;
i++;
if(j==len2-1){
find=1;
end=i;
}

break;
}

/*if(i==len1){
find=0;
break;
}*/

}


}//else if

}//for(j=0;j<len2;j++)
if(find==1){
for(int t=start;t<end;t++)
pszOut[t]=pszIn[t];
break;//已经成功找最先匹配
}
}//for(start=0;start<len1;start++)

if(find==0)
printf("\n不存在匹配");

//*********************************************

return;
}
int main(){
char *pszIn="abcdefgh";
char *pszKey="a*f";
char pszOut[100]={'\0'};
FindMatch(pszIn,pszKey,pszOut);
printf("\n1、The result is:%s\n",pszOut);

memset(pszOut,0,100);
pszKey="a***f";
FindMatch(pszIn,pszKey,pszOut);
printf("\n2、The result is:%s\n",pszOut);

memset(pszOut,0,100);
pszKey="a**f*h";
FindMatch(pszIn,pszKey,pszOut);
printf("\n3、The result is:%s\n",pszOut);

memset(pszOut,0,100);
pszKey="*h";
FindMatch(pszIn,pszKey,pszOut);
printf("\n4、The result is:%s\n",pszOut);

memset(pszOut,0,100);
pszKey="a*";
FindMatch(pszIn,pszKey,pszOut);
printf("\n5、The result is:%s\n",pszOut);

memset(pszOut,0,100);
pszKey="*f*";
FindMatch(pszIn,pszKey,pszOut);
printf("\n6、The result is:%s\n",pszOut);

memset(pszOut,0,100);
pszKey="a**f*h";
FindMatch(pszIn,pszKey,pszOut);
printf("\n7、The result is:%s\n",pszOut);
return 0;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-227088-1-1.html 上篇帖子: 想应聘的瞧仔细了:华为分析大全 下篇帖子: 基于华为CMPP2.0 API开发短信平台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表