第二篇 二分查找 和 最大公约数 实现

继续灌水,这次记录的是这两个面试笔试常出现的问题,记得很早时候在CSDN上看了一篇文章,大意是所谓的程序员 有90%无法一次写出正确的二分查找,当时很不以为然的,结果大三时候去腾讯实习生面试的时候,一面被被这题彻底打败了。。当时顿时就服了。其实简单的东西透着大道理,往往通过和一个人简单的交谈就可以看出这个人的水平如何,因为基础扎实是不需要解释的。。嗯,所以需要努力打基础。
废话不说了直接上代码,本来在自己的电脑里有一份的,机房没有,所以现写一个,但以为能秒杀的事情似乎不那么简单,一写也让我发现原来版本其实很多问题没有完善,Bug还是很多啊,汗颜。调试了10分钟才搞定这个,更说明了简单的事情其实不容小觑的。

int Bsearch( int *a , int left , int right , int value )//二分查找,返回value所在数组a的index
{
if( a[ right ] <value || a[ left ] > value ) return -1;//加这一句好处多多
int mid;
while( left <= right )
{
mid = left + ( right - left ) / 2; // 直接mid=(left+right)/2 可能导致加法溢出

if( a[ mid ] == value )//找到
{
return mid;
}
else if( a[ mid ] < value )//比中间值大说明要找的在右边
{
left = mid + 1 ;
}
else//比中间值小说明在左边
{
right = mid -1;
}
}
return -1;//没找到
}

这道题其实有两种变体的,一个就是找到 最接近value的小于它的值
另一个是找到 最接近value的大于它的值

第二个是求两个数的最大公约数,这个也是常见的,简单但不好一次搞定的题目。。
int gcd( int a , int b )//最大公约数
{
if( a < b ) // 保证顺序是前一个参数>后一个参数
{
swap( a , b );
}
while( b != 0 )// 辗转取余
{
int tmp = a ;
a = b ; //b代替a
b = tmp % b ;//a%b 代替b
}
return a;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值