天天看点

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

最具夫妻相

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

规则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=;
    for(int i=;i<;i++){
    if(male[i]==&&female[i]==)
        res++;
    }
    return res;
}
void findTheBestFemale(string male,string& bestFemale){
    int femaleName[][];
    int maleName[];
    for(int i=;i<;i++)
        for(int j=;j<;j++){
            femaleName[i][j]=; //全部初始化为0
        }
    for(int i=;i<;i++){
        maleName[i]=;
    }
    for(int i=;i<;i++)
    {
        string names=females[i];
        for(int j=;j<names.size();j++){
            if(names[j]<='z'&&names[j]>='a'){
            femaleName[i][names[j]-'a']=;
            }
        }
    }
    for(int j=;j<male.size();j++){
        if(male[j]<='z'&&male[j]>='a'){
            maleName[male[j]-'a']=;
            }
    }
    int max=-;
    int index;
    for(int i=;i<;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 ;
}
           

继续阅读