一道谷歌面试题

今天在网上看了一道面试题:

给定三个整数a,b,c,实现函数int median(int a, int b, int c),返回三个数的中位数。不可以使用sort,要求整数操作(比较,位运行,加减乘除等)次数尽量少。 并分析说明程序最坏和平均情况下使用的次数。

      看到这道题,第一想法是什么是中位数?于是百度了下:

中位数(Medians)统计学名词,是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数,用Me表示。当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。

                那此时题目的意思的就明了了,即对3个数排序,然后返回中间的数,此时想下最少的比较次数,即选中中间的数,另外两个数比较,一次大,一次小,则此时选中的数即为中位数,返回即可,需要2次比较。

         a<b<c时,选中b,与a比较,发现a<b,与c比较,发现b<c,那此时返回b即可,分析到此处,即可写出代码来了,

int median( int a, int b, int c )
{
	int min,max;
	if ( a < b )
	{
		min = a;
		max = b;
	}
	else 
	{
		min = b;
		max = a;
	}
	// 此时有 min<=max
	if ( max <= c )
		return max;
	else // min <= max, c <max, 
	{
		// 比较min和c
		if ( min <= c ) // min <=c < max
			return c;
		else 
			return min; // c< min <= max
	}
}

分析下最少比较2次,最多比较3次,平均2.5次。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值