【华为机试题】最具夫妻相

最具夫妻相
描述: 在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具“夫妻相”的人。题目中预先给定一组女士的姓名拼音。输入男士的姓名拼音(拼音中间可以有空格,字母全部小写),依预先给定姓名拼音的先后遍历所有姓名,输出字母重复数最多的女士姓名。
规则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”

运行时间限制: 无限制
内存限制: 无限制
输入: 输入一个男士姓名,字符串

输出: 输出最具“夫妻相”的女士姓名

样例输入: li si
样例输出: li li

思路:分别用两个哈希表统计男士和女士中出现过的字母,出现了记为1,没出现记为0,然后比较两个哈希表中相同键值对应的值是否都为1,若都为1,则匹配长度加1,如此则可以计算出两个人名字的匹配长度,进而可以找出最大匹配长度的女士。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
string females[]={
    "wang fei",     
    "zhang man yu",     
    "zhang zhi yi",     
    "li li",     
    "li xiao man",     
    "li yu cun",     
    "yang ni",     
    "xiao tong",     
    "li lei",     
    "zhang san"     
};
int countSim(int male[],int female[]){
    int res=0;
    for(int i=0;i<26;i++){
    if(male[i]==1&&female[i]==1)
        res++;
    }
    return res;
}
void findTheBestFemale(string male,string& bestFemale){
    int femaleName[10][26];
    int maleName[26];
    for(int i=0;i<10;i++)
        for(int j=0;j<26;j++){
            femaleName[i][j]=0; //全部初始化为0
        }
    for(int i=0;i<26;i++){
        maleName[i]=0;
    }
    for(int i=0;i<10;i++)
    {
        string names=females[i];
        for(int j=0;j<names.size();j++){
            if(names[j]<='z'&&names[j]>='a'){
            femaleName[i][names[j]-'a']=1;
            }
        }
    }
    for(int j=0;j<male.size();j++){
        if(male[j]<='z'&&male[j]>='a'){
            maleName[male[j]-'a']=1;
            }
    }
    int max=-1;
    int index;
    for(int i=0;i<10;i++){
        int sim =countSim(maleName,femaleName[i]);
        if(sim>max){
            max=sim;
            index=i;
        }
    }
    bestFemale = females[index];
}
int main(void){
    string male;
    string bestFemale;
    while(true)
    {
        getline(cin,male);
        findTheBestFemale(male,bestFemale);
        cout<<bestFemale<<endl;
        system("pause");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值