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

联系人姓名在手机上的数字匹配
问题描述:
针对每个联系人,比如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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值