华为2011年软件岗位校园招聘机试题---联系人姓名在手机上的数字匹配

来源:互联网 发布:mac相簿批量删除照片 编辑:程序博客网 时间:2024/04/30 03:25
联系人姓名在手机上的数字匹配
问题描述:
针对每个联系人,比如John Smith,我们可以通过如下两种方式进行匹配:
1、 首几个连续字母。以上面的例子来说明:J(5)o(6)h(4);
2、 联系人姓和名的首字母匹配。以上面的例子来说明:J(5)ohn S(7)mith


现在需要实现如下函数,寻找与联系人姓名匹配的数字,并按字符串形式返回,要求如下:
1、 简单起见,只考虑英文联系人的情况,英文大小写都有可能出现,大小写统一对待;
2、 英文联系人的姓和名之间只可能包含空格,没有其他怪异的符号;
3、 联系人的姓名可能只包含一个单词,也可能包含多个单词,每个单词不少于3个字母。
4、 如果联系人姓名只有一个单词,返回首3个字母的数字匹配;
如果联系人姓名包括多个单词,返回每个单词的首字母匹配,单词数超过3个的,只需要输出前三个单词的首字母匹配。
5、 返回类型为字符串形式的数字,比如”John”匹配5、6和4,则返回字符串”564”;”John smith”匹配5和7,则返回字符串”57”


示例:
1输入:”Willam”,输出:”945”;
2输入:”WILLAM”,输出:”945”
3输入:”John Smith”,输出:”57”;

4输入:”John Smith Green Carlos”,输出:”574”;


这个题目主要考察里如下几个方面:

1.使用c++的cin函数操作是会有一定的限制,因为cin函数默认是遇到空格或者是回车结束接收字符的;

2.对于strcpy 和 strncpy 以及memcpy的使用;

3.就是注意:手机键盘的结构布局,看的时候要认真;



下面是C语言的代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>int main(){char name[100] = {'\0'};gets(name);int len = strlen(name);if(len < 3)return 0;strlwr(name);char id[4] = {'\0'};memcpy(id,name,3);int count = 0,i=0;for(i=0;i<len;i++)if(name[i] == ' ')if(++count < 3)id[count] = name[i+1];elsebreak;if(count == 1)id[2] = '\0';len = strlen(id);printf("%s\n",id);for(i=0;i<len;i++){int b = (id[i]-'a')/3;if(b<6) b+=2;switch(b){case 6:if(id[i] <= 's')b = 7;elseb = 8;break;case 7:if(id[i] == 'u')b = 8;elseb = 9;case 8:b = 9;}printf("%d",b);}printf("\n");return 0;}

对于边界的处理,特备是最后的几个字母,求各位大神指点一二,让代码显得工整些!批评指正请留言!

2 0
原创粉丝点击