联系人姓名在手机上的数字匹配
问题描述:
针对每个联系人,比如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”;
对于边界的处理,特备是最后的几个字母,求各位大神指点一二,让代码显得工整些!批评指正请留言!
问题描述:
针对每个联系人,比如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];
else
break;
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;
else
b = 8;
break;
case 7:
if(id[i] == 'u')
b = 8;
else
b = 9;
case 8:
b = 9;
}
printf("%d",b);
}
printf("\n");
return 0;
}
对于边界的处理,特备是最后的几个字母,求各位大神指点一二,让代码显得工整些!批评指正请留言!