百度笔试题2

1、写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{24347}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在13随便输出哪一个均可。
函数接口为:int find_orderk(const int* narry,const int n,const int k)

Answer:另外使用一个数组b[]记录原来的数据,再使用堆排序,进行k次堆排序,然后输出堆顶的元素。将该元素输m出后,在b[]中遍历查找m的位置,然后输出

 

 

2 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3  (此题10 

 (不用考虑数值超出计算机整数界限的问题) 

 

Answer:(采用数组a[M]记录N!的每一位,a[0]放置该数字的长度,然后遍历整个数组,计算尾部连续的0的个数。)

http://blog.csdn.net/sailor_8318/archive/2008/10/17/3088162.aspx

BaiduEMC的笔势题:对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。(不用考虑数值超出计算机整数界限的问题) 

 

 

思路分析:

 

本题要用数学的方法来解决效率最高,连续K0,则说明是10^K的倍数,即(2×5)^ K= 2^K× 5^K;待求的数为N*(N-1)(N-2)………1,由于每两个数至少可以分解出122肯定比5多,因此K的个数取决于上式的分解因子中有几个5的问题;能拆解出5的只可能是5的倍数,而能拆解出多少个5则看这个数是5的几次方的倍数了

方法一:

 

 

int ZerosForN_1(int n)

{

        int fives,result=0,i;

        for(fives=5; n >=fives; fives+=5)      // 循环次数为n/5

        {      

                for(i=fives; i%5==0; i/=5) // 此处的最大循环次数为 LOG5(N)

                {

                       ++result;      

                }

        }

        //printf("%d/n",result);

    return result;

 

}

for循环的算法复杂度最容易看出来,就是for循环的次数,最大循环次数为n/5 * LOG5(N) ,因此复杂度是Onlogn)的

思路最清晰,即对于每个5的倍数的值,求其可被5整除的次数,即可求出最后5的因子个数和

方法二:

int ZerosForN_2(int n)

{

       int pow5,result=0;

        for(pow5=5; n >=pow5; pow5*=5) // 此处的循环次数为LOG5(N)

        {

                result+=n / pow5;

        }

        //printf("%d/n",result);

    return result;

}

N不变,pow55的幂递增,此算法的思想是求出N以内所有被5整除的数的个数,所有被25整除的个数(在5的基础上多出了一个5因子),所有被125整除的个数(在25的基础上多出了一个5因子)。。。。

设最大数为N,

5^(n+1)  > N  >= 5^n

[N/5] + [N/(5^2)] + [N/(5^3)] + ... + [N/(5^n)] 即为连续0的个数

上述式子的项数为log5(N),即为循环的次数,故复杂度为log5(N)

方法三:

[N/5] + [N/(5^2)] + [N/(5^3)] + ... + [N/(5^n)]

=[N/5] + [[N/5]/5] + [ [[N/5]/5]/5] + ... + [。。。]

=A1+ [A1/5] + [A2/5] + ... + [An-1/5]

即上述各项构成等比数列,An=An-1/5,等比为1/5

 

即对A1反复除5,只要其大于0,即相加,便得到以下算法:

int ZerosForN_3(int n)

{

    int result=0;

    n/=5;  // A1

    while(n >0

        {

        result += n; //求和

        n/=5;         // An

    }

        //printf("%d/n",result);

    return result;

}

等比数列的项数为log5(N),即为循环的次数,故复杂度为log5(N)

 

3   编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url 

     如下形式叫做首页: 

     militia.info/ 

     www.apcnc.com.cn/ 

     http://www.cyjzs.comwww.greena888.com/ 

     www.800cool.net/ 

     http://hgh-products.my-age.net/ 

     如下形式叫做目录页: 

     thursdaythree.net/greenhouses--gas-global-green-house-warming/ 

     http://www.mw.net.tw/user/tgk5ar1r/profile/ 

     http://www.szeasy.com/food/yszt/chunjie/ 

     www.fuckingjapanese.com/Reality/ 

  此题10分)

     请注意: 

     a url有可能带http头也有可能不带 

     b)动态url(即含有""url)的一律不算目录页,如: 

     www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/ 

     www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/ 

     另:如果你会linux,请用linux下的grep命令实现第2题的功能(附加5分)。 

 

Answer

http://hi.baidu.com/cuifenghui/blog/item/bea757435238a0129213c609.html

/***********************************************

描述: 编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url 

   如下形式叫做首页: 

   militia.info/ 

  www.apcnc.com.cn/ 

  http://www.cyjzs.comwww.greena888.com/ 

  www.800cool.net/ 

  http://hgh-products.my-age.net/ 

   如下形式叫做目录页: 

   thursdaythree.net/greenhouses--gas-global-green-house-warming/ 

  http://www.mw.net.tw/user/tgk5ar1r/profile/ 

  http://www.szeasy.com/food/yszt/chunjie/ 

  www.fuckingjapanese.com/Reality/ 

  

   请注意: 

   a url有可能带http头也有可能不带 

   b)动态url(即含有""url)的一律不算目录页,如: 

  www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/ 

  www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/ 

  

   另:如果你会linux,请用linux下的grep命令实现第2题的功能(附加5分)。

 

   思路: 经观察,首页类的url中之多含有3/(http头的//和末尾的/),或者只含有1

   /(没有http),而目录类的url所含的个数至少为2(此时不含http)或至少4(此时

   包含http)。如果url中出现?则视为动态网页,归类为其他网页。

 

   作者: xiaocui

   时间: 2007.9.12

   版本: v1.0

 

   **************************************************************************/

 

#include <iostream>

#include <string>

using namespace std;

 

string result[3] = {"首页","目录页","其他页"};

 

string   getCategory(string url)

{

//首先判断是否是动态网页

if ( strchr(url.c_str(),'?') != NULL )

{

   return   result[2];

}

 

bool   isHttp; //是否包含http

if ( strstr(url.c_str(), "http://") != NULL )

{

   isHttp = true;

}

else

{

   isHttp = false;

}

 

if ( isHttp == true )

{

   char* buff = new char[url.size()-7]; //去除http://和最后的/

   int i;

   for(i=0; i<url.size()-8; ++i)

   {

    buff[i] = url[7+i];

   }

   buff[i] = '/0';

   if ( strchr(buff,'/') == NULL )

   {

    delete[] buff;

    return result[0];

   }

   else

   {

    delete[] buff;

    return result[1];

   } 

}

else

{

   char* buff = new char[url.size()+1];

   strcpy(buff,url.c_str());

   buff[strlen(buff)-1] = '/0'; //去除最后的/

   if ( strchr(buff,'/') == NULL )

   {

    delete[] buff;

    return   result[0];

   }

   else

   {

    delete[] buff;

    return   result[1];

   }

}

}

 

int main()

{

cout << "请输入url: ";

string url;

cin >> url;

cout << "url类型为: " <<getCategory(url) << endl;

 

return 0;

}

 

 

 

 

 

 

 

4 如果必须从网页中区分出一部分"重要网页"(例如在10亿中选8亿),比其他网页更值得展现给用户,请提出一种方案。(此题40分)


    
假设有10亿网页已经被我们存下来,并提供如下信息:网页全文(即网页的源码)、全文长度、网页正文(即网页中提取的主体文字)、  正文长度,以及其他网页提取物等,现在希望去掉其中的重复网页,请提出可行的方案,计算出每个网页对应的重复度,你可以自己  
对网页重复下定义,也可以提出需要哪些更多的网页提取物来实现更好的去重复方案

 

Answer:

http://topic.csdn.net/u/20080523/15/2df34173-58a4-4c36-9438-de1ec8b9cb14.html

1)如果必须从网页中区分出一部分"重要网页"(例如在10亿中选8亿)

PageRank

Lz 说道去掉其中的重复网页

计算相似度,投到向量空间上去,计算夹角

这些都是考Sense的,你若能提出完美的解决方案,百度不去也罢,基本可以自己搞了。

就是,有些公司面试会拿一些公司目前还在设计的算法,群策群力,从中找到一些思想

你可以自己对网页重复下定义——如果想到优秀的算法,有个更好的定义,就可以自己搞了

怀疑这种题不是测试题,就是他们内部的算法需求。

2) http://bbs.chinaunix.net/viewthread.php?tid=983568&page=2

网页除重,根据不同的应用,考虑到效率,又不同的办法。

如果数据量小,可以用词频相似度的办法。Sim(A,B)=2   *   same(A,B)/(|A|+|B|),

为了提高速度,可以先对所有文档建立词级的倒排索引表,记录长度表。这样输入一篇新的文档,求与它相似的所有文档的时候,就不需要>把输入文档与库中记录一一比较。只需要切词,检索,索引归并,截取,就能找到所有相似文章。可以用title来做,也可以用content来做。>这种方法的复杂度几乎为常数。

对于垂直领域的搜索,这种种方法是足够了。

如果数据量实在太庞大。目前只有关键词签名法,最长句子签名法。(对于通用搜索引擎)

 

首先,网页去重分为链接去重和内容去重。链接是否重复可以使用布隆过滤器,内容去重可以使用向量空间模型,计算两个网页的夹角;也可以提取网页的适当内容,然后判断这些内容是否相似来判断两个个网页的重复读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyf31

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值