今天去华为参加暑期实习生机试,一共三个题目,前面两个较为简单(二选一)。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