【华为上机】最具夫妻相

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

 

import java.util.Scanner;


public class xingming {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String[] names = {"wang fei", 
				 "zhang man yu", 
				 "zhang zhi yi", 
				 "li li", 
				 "li xiao man", 
				 "li yu cun", 
				 "yang ni", 
				 "xiao tong", 
				 "li lei", 
				 "zhang san" };
		boolean[][] c = new boolean[10][26];
		for(int i=0;i<10;i++){
			for(int j=0;j<26;j++){
				c[i][j] = false;
			}
		}
		for(int i=0;i<10;i++){
			String name = names[i];
			name = name.replaceAll(" ", "");
			int len = name.length();
			for(int j=0;j<len;j++){
				c[i][(name.charAt(j)-'a')] = true;
			}
		}
		
		Scanner cin = new Scanner(System.in);
		while(cin.hasNext()){
			String male = cin.nextLine();
			int max = Integer.MIN_VALUE;
			int index = -1;
			male = male.replaceAll(" ", "");
			boolean[] malec = new boolean[26];
			for(int i=0;i<26;i++)
				malec[i] = false;
			int l = male.length();
			for(int i=0;i<l;i++){
				malec[male.charAt(i)-'a'] = true;
			}
			for(int i=0;i<10;i++){
				int s = sim(malec,c[i]);
				if(s>max){
					max = s;
					index = i;
				}
			}
			System.out.println(names[index]);
		}
	}

	private static int sim(boolean[] malec, boolean[] bs) {
		// TODO Auto-generated method stub
		int len = malec.length;
		int r = 0;
		for(int i=0;i<len;i++){
			if(malec[i]&&bs[i])
				r++;
				
		}
		return r;
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值