百度筆試題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來做。>這種方法的複雜度幾乎爲常數。

對於垂直領域的搜索,這種種方法是足夠了。

如果數據量實在太龐大。目前只有關鍵詞簽名法,最長句子簽名法。(對於通用搜索引擎)

 

首先,網頁去重分爲鏈接去重和內容去重。鏈接是否重複可以使用布隆過濾器,內容去重可以使用向量空間模型,計算兩個網頁的夾角;也可以提取網頁的適當內容,然後判斷這些內容是否相似來判斷兩個個網頁的重複讀。

發佈了35 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章