码迷,mamicode.com
首页 > 其他好文 > 详细

华为上机题之输出身高差值最小的俩个人

时间:2015-08-17 17:20:07      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:acm   java   华为笔试   

 要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
 Smple     input:161 189 167 172 188 
    Sample outPut: 188 189

    分析:
    看到这个题,最小想到的全排问题,从5个人中抽2个人出来,一共有10中情况。计算出来后,马上想到的是用排序来这10种情况的差值,选取差值最小那一组的俩个人。
    接下来想到的是用什么数据结构。每一种情况需要存储a、b两个人的编号、俩个人的差值。很显然,数组是搞不定的啦。
    我的思路是这个样子滴,自定义一个类Model,里面装了a、b两个得编号,和他们的差值。让他们实现了comparable接口。接下来,我用了TreeSet结构,将Model插进去,让TreeSet帮我们排序。这里有个小技巧,实现comparable接口时,故意将大小的次序跌倒,这样TreeSet中的对象,差值最小的在最前面。
    代码:
public class JinZhi
{
	static class Model implements Comparable<Model>
	{
		int a;
		int b;
		int min;//a、b两个人的身高差值
		public Model(int a, int b, int min)
		{
			this.a=a;
			this.b=b;
			this.min=min;
		}
		@Override
		public int compareTo(Model o)
		{
			// TODO Auto-generated method stub
			if (this.min<o.min)
			{
				return -1;
			}
			else {
				return 1;
			}
		}	
		
		@Override
		public String toString()
		{
			// TODO Auto-generated method stub
			return a+" "+b+" "+min;
		}
	}
	public static void main(String[] args)
	{
		Scanner scanner=new Scanner(System.in);
		int[] a=new int[5];
		int i=0;
		while(i<5&&scanner.hasNextInt())
		{
			a[i++]=scanner.nextInt();
		}
		
		TreeSet<Model> treeSet=new TreeSet<>();
		for (int j = 0; j < a.length; j++)
		{
			for (int k = j+1; k < a.length; k++)
			{
				treeSet.add(new Model(j, k, Math.abs(a[j]-a[k])));
			}
		}
		
		Iterator<Model> iterator=treeSet.iterator();
		int max_1=0;
		int max_2=0;
		int min=0;
		while(iterator.hasNext())
		{
			Model tempModel=iterator.next();
			if (min==0)
			{
				if (a[tempModel.a]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.a];
				}
				else if (a[tempModel.a]<max_1&&a[tempModel.a]>max_2){
					max_2=a[tempModel.a];
				}
				
				if (a[tempModel.b]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.b];
				}
				else if (a[tempModel.b]<max_1&&a[tempModel.b]>max_2){
					max_2=a[tempModel.b];
				}
				min=tempModel.min;
			}
			else if(tempModel.min==min)
			{
				if (a[tempModel.a]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.a];
				}
				else if (a[tempModel.a]<max_1&&a[tempModel.a]>max_2){
					max_2=a[tempModel.a];
				}
				
				if (a[tempModel.b]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.b];
				}
				else if (a[tempModel.b]<max_1&&a[tempModel.b]>max_2){
					max_2=a[tempModel.b];
				}
			}
			else
				break;
		}
		System.out.println(max_2+" "+max_1);
	}	
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

华为上机题之输出身高差值最小的俩个人

标签:acm   java   华为笔试   

原文地址:http://blog.csdn.net/lyric_315/article/details/47727153

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!