[华为机试真题]69.姓名的夫妻相

原创 2015年07月07日 10:52:48

题目

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

规则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"

运行时间限制:

无限制 

内存限制:

无限制 

输入:

输入一个男士姓名,字符串 

输出:

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

代码

/*---------------------------------------
*   日期:2015-07-07
*   作者:SJF0115
*   题目:姓名的夫妻相
*   来源:华为机试真题
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

#define GirlSize 10

string girlName[GirlSize+1] = {"wang fei","zhang man yu","zhang zhi yi","li li","li xiao man","li yu cun","yang ni","xiao tong","li lei","zhang san"};

vector<vector<int> > hash(GirlSize,vector<int>(26,0));

// 预处理女士姓名
void Init(){
    for(int i = 0;i < GirlSize;++i){
        int count = girlName[i].size();
        for(int j = 0;j < count;++j){
            if(girlName[i][j] != ' '){
                ++hash[i][girlName[i][j] - 'a'];
            }//if
        }//for
    }//for
}

string MaxDupicate(string name){
    int size = name.size();
    // 去掉重复字符
    vector<int> boyHash(26,0);
    for(int k = 0;k < size;++k){
        if(name[k] != ' '){
            ++boyHash[name[k] - 'a'];
        }//if
    }//for
    int count = 0;
    int max = 0;
    // 记录重复数最多的女孩下标
    int index = 0;
    // 比较 获取重复数
    for(int i = 0;i < GirlSize;++i){
        count = 0;
        for(int j = 0;j < 26;++j){
            if(hash[i][j] > 0 && boyHash[j] > 0){
                ++count;
            }//if
        }//for
        // 更新最大值
        if(max < count){
            max = count;
            index = i;
        }//if
    }//for
    return girlName[index];
}

int main(){
    string name;
    //freopen("C:\\Users\\Administrator\\Desktop\\acm.txt","r",stdin);
    // 预处理
    Init();
    while(getline(cin,name)){
        cout<<MaxDupicate(name)<<endl;
    }//while
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

[华为机试真题]66.单词搜索

题目代码/*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * ...

2014届华为校园招聘机试题

一、题目描述(60分): 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

[华为机试真题]73.公交站寻址

题目一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。 现给定路径长度Y,找到能够到达的公交站的个数,路...

2016华为校招上机试题2——洞穴逃生

二、洞穴逃生 描述:精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为1...

[华为机试真题]70.分苹果

题目M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。1<=M<=10,1<=Nm:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) f(m,n) = f(...

资深CIO谈OA选型攻略

近年来,OA软件成为中国管理软件中一颗最耀眼的明星,OA厂商的多样化和0A品牌的参差不齐,也已是业内公认的事实。作为CIO,面对如此众多的OA产品和供应商,纵使有多年经验练就的一双慧眼,也未必没有踌躇...

华为校招一道上机题:等式变换

参考来源:http://blog.csdn.net/Hackbuteer1/article/details/39253767输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。...

2016华为校招上机试题1——交叉排序

一、交叉排序 描述:给定一串整数输入,数字间用空格分隔,将这串数字的奇数位按升序排列,偶数位按降序排列。并打印输出交叉排序后的结果。 样例输入:8 2 4 3 5 6 1 7 样例输出:1 8 ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)