华为机试—姓名的夫妻相

题目:夫妻相

在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是夫妻相。所谓夫妻相,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。

本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具夫妻相的人。

题目中预先给定一组女士的姓名拼音。输入男士的姓名拼音(拼音中间可以有空格,字母全部小写),依预先给定姓名拼音的先后遍历所有姓名,输出字母重复数最多的女士姓名。


规则1:如果字母重复数最多的女士有多位相同,则以最先匹配的女士做为最具夫妻相的人选。
规则2:人名中的相同字母,按重复一次处理。例如:li ling li lei 重复的字符个数为2,而不是4
预置女士名单(先后循序必须保证):
"wang fei",
"zhang man yu",
"zhang zhi yi",
"li li",
"li xiao man",
"li yu cun",
"yang ni",
"xiao tong",
"li lei",
"zhang san"

运行时间限制无限制 
内存限制无限制 

输入输入一个男士姓名,字符串 
输出输出最具夫妻相的女士姓名


基本思路

找到男士女士名字里出现的字母,比如说wang yun,出现的字母为a,g,n,y,u,w.然后匹配两个名字里出现的字母重复数,如果都出现了某个字母,重复数就加1.


#include <iostream>  
#include <string>  
using namespace std;  
  
//10个名字,26个字符
char nameArray[10][26]={"wang fei","zhang man yu","zhang zhi yi","li li",  
"li xiao man","li yu cun","yang ni","xiao tong","li lei","zhang san"};  
  
//找出a,b中字母重复的次数
int findCount(bool a[],bool b[])  
{  
    int count=0;  
    for(int i=0;i<26;i++) {
		if(a[i]&&b[i])  
		count++; 
	}
    return count;  
}  
  
int main()  
{  
    char name[100];  
    gets(name); 
  
    bool flag_0[10][26]; //每个女士名字中记录出现的字母,出现为1,不出现为0
    memset(flag_0,0,sizeof(flag_0)); 
	
    int i,j;   
    for(i=0;i<10;i++)  
    {  
        for(j=0;nameArray[i][j]!='\0';j++)  
        {  
            if(nameArray[i][j]<='z' && nameArray[i][j]>='a')  
            {  
                flag_0[i][nameArray[i][j]-'a']=1;  
            }  
        }  
    }  

    bool flag_1[26];  //每个男士名字中记录出现的字母,出现为1,不出现为0
    memset(flag_1,0,sizeof(flag_1));  

    for(i=0;name[i]!='\0';i++)  
    {  
        if(name[i]<='z' && name[i]>='a')  
        {  
            flag_1[name[i]-'a']=1;  
        }  
    }  
  
  
    int count[10]; //记录每个女士名字中和输入的男士名字中的重复字母数
	int max =0;
    for(i=0;i<10;i++)  
    {  
        count[i]=findCount(flag_1,flag_0[i]); 
		if(count[i]>max)  
            max=count[i];  //输出匹配度最高的次数
    }       
  
    for(i=0;i<10;i++)  
    {  
        if(count[i]==max)  
        {  
            cout<<nameArray[i]<<endl; //输出最先匹配的女士名字 
            break;  
        }  
    }  
  
    return 0;  
}


测试结果,可能不周全,欢迎查漏补缺:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值