最新九月百度人搜,阿里巴巴,騰訊華爲京東小米筆試面試二十題

最新九月百度人搜,阿里巴巴,騰訊華爲京東小米筆試面試二十題


引言

    自發表上一篇文章至今(事實上,上篇文章更新了近3個月之久),blog已經停了3個多月,而在那之前,自開博以來的21個月每月都不曾斷過。正如上一篇文章支持向量機通俗導論(理解SVM的三層境界)末尾所述:”額,blog許久未有更新了,因爲最近實在忙,無暇顧及blog。“與此同時,工作之餘,也一直在閒心研究學習數據挖掘:"神經網絡將可能作爲Top 10 Algorithms in Data Mining之番外篇第1篇,同時,k-最近鄰法(k-nearest neighbor,kNN)算法談到kd樹將可能作爲本系列第三篇。這是此係列接下來要寫的兩個算法,剛好項目中也要用到KD樹“。

    但很顯然,若要等到下一篇數據挖掘系列的文章時,說不定要到年底去了,而最近的這段時間,9月,正是各種校招/筆試/面試火熱進行的時節,自己則希望能幫助到這些找工作的朋友,故此,怎能無動於衷,於是,3個多月後,blog今天更新了。

    再者,雖然如我的這條微博:http://weibo.com/1580904460/yzs72mmFZ所述,blog自10年10月開通至11年10月,一年的時間內整理了300多道面試題(這300道題全部集錦在此文中第一部分:http://blog.csdn.net/v_july_v/article/details/6543438)。但畢竟那些題已經是前年或去年的了,筆試面試題雖然每年類型變化不大,但畢竟它年年推陳出新,存着就有其合理性。

    OK,以下是整理自8月下旬至9月中旬各大公司的筆試面試二十題,相信一定能給正在參加各種校招的諸多朋友多少幫助,學習參考或借鑑(如果你手頭上若有好的筆試/面試題,歡迎通過微博私信:http://weibo.com/julyweibo,或郵箱:[email protected]發給我,或者乾脆直接評論在本文下;同時,若你對以下任何一題有任何看法.想法.思路或建議,歡迎留言評論,大家一起討論,共同享受思考的樂趣,謝謝)。

九月百度人搜,阿里巴巴,騰訊華爲京東小米筆/面試二十題

  1. 9月11日, 京東:

    談談你對面向對象編程的認識

  2. 8月20日,金山面試,題目如下:
        數據庫1中存放着a類數據,數據庫2中存放着以天爲單位劃分的表30張(比如table_20110909,table_20110910,table_20110911),總共是一個月的數據。表1中的a類數據中有一個字段userid來唯一判別用戶身份,表2中的30張表(每張表結構相同)也有一個字段userid來唯一識別用戶身份。如何判定a類數據庫的多少用戶在數據庫2中出現過?
    來源:http://topic.csdn.net/u/20120820/23/C6B16CCF-EE15-47C0-9B15-77497291F2B9.html
  3. 百度實習筆試題(2012.5.6)
      簡答題1
    一個單詞單詞字母交換,可得另一個單詞,如army->mary,成爲兄弟單詞。提供一個單詞,在字典中找到它的兄弟。描述數據結構和查詢過程。評點同去年9月份的一道題,見此文第3題:http://blog.csdn.net/v_july_v/article/details/6803368
      簡答題2
    線程和進程區別和聯繫。什麼是“線程安全”
    簡答題3
    C和C++怎樣分配和釋放內存,區別是什麼
      算法題1
    一個url指向的頁面裏面有另一個url,最終有一個url指向之前出現過的url或空,這兩種情形都定義爲null。這樣構成一個單鏈表。給兩條這樣單鏈表,判斷裏面是否存在同樣的url。url以億級計,資源不足以hash。
      算法題2
    數組al[0,mid-1] 和 al[mid,num-1],都分別有序。將其merge成有序數組al[0,num-1],要求空間複雜度O(1)
      系統設計題
    百度搜索框的suggestion,比如輸入北京,搜索框下面會以北京爲前綴,展示“北京愛情故事”、“北京公交”、“北京醫院”等等搜索詞。
    如何設計使得空間和時間複雜度儘量低。評點老題,直接上Trie樹,Trie樹的介紹見:從Trie樹(字典樹)談到後綴樹。但很快,朋友威士忌就在本文評論下指出:題意允許中文漢字前綴,樸素的trie是無法有效解決漢字問題的。待考證
  4. 人搜筆試1. 快排每次以第一個作爲主元,問時間複雜度是多少?(O(N*logN))
      2. T(N) = N + T(N/2)+T(2N), 問T(N)的時間複雜度是多少?(O(N))
      3. 從(0,1)中平均隨機出幾次才能使得和超過1?(e)
      4.編程題:
     一棵樹的節點定義格式如下:
     struct Node{
        Node* parent;
        Node* firstChild; // 孩子節點
        Node* sibling; // 兄弟節點 
    }
    要求非遞歸遍歷該樹。
    思路:採用隊列存儲,來遍歷節點。
      5. 算法題:
    有N個節點,每兩個節點相鄰,每個節點只與2個節點相鄰,因此,N個頂點有N-1條邊。每一條邊上都有權值wi,定義節點i到節點i+1的邊爲wi。
    求:不相鄰的權值和最大的邊的集合。
  5. 2011,人搜面試,所投職位:搜索研發工程師:面試題回憶 
         1、刪除字符串開始及末尾的空白符,並且把數組中間的多個空格(如果有)符轉化爲1個。
         2、求數組(元素可爲正數、負數、0)的最大子序列和。 
         3、鏈表相鄰元素翻轉,如a->b->c->d->e->f-g,翻轉後變爲:b->a->d->c->f->e->g 
         4、鏈表克隆。鏈表的結構爲: 
         typedef struct list { 
             int data; //數據字段 
         list *middle; //指向鏈表中某任意位置元素(可指向自己)的指針 
         list *next;//指向鏈表下一元素 
         } list; 
         5、100萬條數據的數據庫查詢速度優化問題,解決關鍵點是:根據主表元素特點,把主表拆分並新建副表,並且利用存儲過程保證主副表的數據一致性。(不用寫代碼) 
         6、求正整數n所有可能的和式的組合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2) 
         7、求旋轉數組的最小元素(把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個排好序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3, 4, 5, 1, 2}爲{1, 2, 3, 4, 5}的一個旋轉,該數組的最小值爲1。) 
         8、找出兩個單鏈表裏交叉的第一個元素 
         9、字符串移動(字符串爲*號和26個字母的任意組合,把*號都移動到最左側,把字母移到最右側並保持相對順序不變),要求時間和空間複雜度最小 
         10、時間複雜度爲O(1),怎麼找出一個棧裏的最大元素   
         11、線程、進程區別 
         12、static在C和C++裏各代表什麼含義 
         13、const在C/C++裏什麼意思 
         14、常用linux命令 
         15、解釋Select/Poll模型 
  6. 百度,網易,阿里巴巴等面試題:http://blog.csdn.net/hopeztm/article/category/1201028
  7. 8月30日,網易有道面試題
    var tt = 'aa';
    function test()
    {
      alert(tt);
      var tt = 'dd';
      alert(tt);
    }
    test();  
  8. 8月31日,百度面試題:不使用隨機數的洗牌算法,詳情:http://topic.csdn.net/u/20120831/10/C837A419-DFD4-4326-897C-669909BD2086.html
  9. 9月6日,阿里筆試題:平面上有很多點,點與點之間有可能有連線,求這個圖裏環的數目。
  10. 9月6日,阿里巴巴面試:
    1、介紹一下你自己。
    2、介紹一下你認爲做的最好的一個項目。
    3、請用五分鐘的時間把你做的項目的流程圖畫一下。
    4、項目中你遇到的難點是什麼?怎麼解決的?
    5、項目中你認爲哪個技術是你最拿手的?
    6、介紹一下HTTP協議
    7、如何把一個大的日誌文件哈希到不同的哈希表中,這些哈希表的存儲格式是什麼?
    8、linux網絡編程,畫一個c/s通信的流程
    9、多線程瞭解多少,做過的項目中有沒有用到過?
    10、描述一下動態規劃的思想
    11、快排。
    12、內存分配方式有哪幾種?代碼段放在哪個內存區?static int a[1024][1024][1024]放在哪個區?會不會有異常?
    13、如何表示圖?
    14、如何驗證圖的連通性?
    15、對互聯網的業務和技術是否關注?

  11. 9月7日,一道華爲上機題:
    題目描述: 選秀節目打分,分爲專家評委和大衆評委,score[] 數組裏面存儲每個評委打的分數,judge_type[] 裏存儲與 score[] 數組對應的評委類別,judge_type == 1,表示專家評委,judge_type == 2,表示大衆評委,n表示評委總數。打分規則如下:專家評委和大衆評委的分數先分別取一個平均分(平均分取整),然後,總分 = 專家評委平均分 * 0.6 + 大衆評委 * 0.4,總分取整。如果沒有大衆評委,則 總分 = 專家評委平均分,總分取整。函數最終返回選手得分。
    函數接口 int cal_score(int score[], int judge_type[], int n)  
     上機題目需要將函數驗證,但是題目中默認專家評委的個數不能爲零,但是如何將這種專家數目爲0的情形排除出去。
    來源:http://topic.csdn.net/u/20120907/15/c30eead8-9e49-41c2-bd11-c277030ad17a.html
  12. 9月8日,騰訊面試題:
    假設兩個字符串中所含有的字符和個數都相同我們就叫這兩個字符串匹配,
     比如:abcda和adabc,由於出現的字符個數都是相同,只是順序不同,
     所以這兩個字符串是匹配的。要求高效!
    又是跟上述第3題中簡單題一的兄弟節點類似的一道題,我想,你們能想到的,這篇blog裏:http://blog.csdn.net/v_JULY_v/article/details/6347454都已經有了。
  13. 阿里雲,搜索引擎中5億個url怎麼高效存儲;
  14. 創新工場微博,前幾天才發佈的難道不少人的的牛題:http://t.qq.com/iwrecruiting?pgv_ref=im.WBlog.guest&ptlang=2052
  15. 4**9 的筆試題,比較簡單:
    1.求鏈表的倒數第二個節點
    2.有一個整數數組,求數組中第二大的數

  16.  阿里巴巴二道題
    第一道:
    對於給定的整數集合S,求出最大的d,使得a+b+c=d。a,b,c,d互不相同,且都屬於S。集合的元素個數小於等於2000個,元素的取值範圍在[],假定可用內存空間爲100MB,硬盤使用空間無限大,試分析時間和空間複雜度,找出最快的解決方法。
    阿里巴巴第二道(研發類)
    筆試題1,原題大致描述有一大批數據,百萬級別的。數據項內容是:用戶ID、科目ABC各自的成績。其中用戶ID爲0~1000萬之間,且是連續的,可以唯一標識一條記錄。科目ABC成績均在0~100之間。有兩塊磁盤,空間大小均爲512M,內存空間64M。
    1) 爲實現快速查詢某用戶ID對應的各科成績,問磁盤文件及內存該如何組織;
    2) 改變題目條件,ID爲0~10億之間,且不連續。問磁盤文件及內存該如何組織;
    3) 在問題2的基礎上,增加一個需求。在查詢各科成績的同時,獲取該用戶的排名,問磁盤文件及內存該如何組織。
    筆試題2:代碼實現計算字符串的相似度。 
  17. 9月11日,京東全套筆試題:
  18. 旋轉字符串,也就是我寫的編程藝術系列第一章左旋轉字符串:http://blog.csdn.net/v_JULY_v/article/details/6322882的題。也有一些朋友寫http://www.cnblogs.com/bakari/archive/2012/09/09/2677155.html當然,有些書上也收錄過此題,並給出了與我思路類似的解答,如下圖所示:
  19. 多玩YY 2012校園招聘筆試題  C++  A

    時間:120分鐘          提示:請注意代碼風格

    1、請給出以下程序的輸出:(12分)

    1. class A  
    2. {  
    3. public:  
    4.     A()  
    5.     {  
    6.         puts("In A");  
    7.     }  
    8.     ~A()  
    9.     {  
    10.         puts("Out A");  
    11.     }  
    12. };  
    13.   
    14. class B  
    15. {  
    16. public:  
    17.     B()  
    18.     {  
    19.         puts("In B");  
    20.     }  
    21.     ~B()  
    22.     {  
    23.         puts("Out B");  
    24.     }  
    25. };  
    26.   
    27. class X  
    28. {  
    29. public:  
    30.     X()  
    31.     {  
    32.         puts("In X");  
    33.     }  
    34.     ~X()  
    35.     {  
    36.         puts("Out X");  
    37.     }  
    38.     virtual void test()  
    39.     {  
    40.         puts("test in X");  
    41.     }  
    42. };  
    43.   
    44. class C:public X  
    45. {  
    46. public:  
    47.     C(): b(), a()  
    48.     {  
    49.         puts("In C");  
    50.   
    51.     }  
    52.     ~C()  
    53.     {  
    54.         puts("Out C");  
    55.     }  
    56.     virtual void test()  
    57.     {  
    58.         puts("test in C");  
    59.     }  
    60. private:  
    61.     A a;  
    62.     B b;  
    63. };  
    64.   
    65. int main()  
    66. {  
    67.     X* p = new C;  
    68.     p->test();  
    69.     delete p;  
    70.   
    71.     return 0;  
    72. }   
    class A
    {
    public:
    	A()
    	{
    		puts("In A");
    	}
    	~A()
    	{
    		puts("Out A");
    	}
    };
    
    class B
    {
    public:
    	B()
    	{
    		puts("In B");
    	}
    	~B()
    	{
    		puts("Out B");
    	}
    };
    
    class X
    {
    public:
    	X()
    	{
    		puts("In X");
    	}
    	~X()
    	{
    		puts("Out X");
    	}
    	virtual void test()
    	{
    		puts("test in X");
    	}
    };
    
    class C:public X
    {
    public:
    	C(): b(), a()
    	{
    		puts("In C");
    
    	}
    	~C()
    	{
    		puts("Out C");
    	}
    	virtual void test()
    	{
    		puts("test in C");
    	}
    private:
    	A a;
    	B b;
    };
    
    int main()
    {
    	X* p = new C;
    	p->test();
    	delete p;
    
    	return 0;
    } 

    2、請簡述以下const的作用(8分)

    1)const int a = 10;
    2)const  int*
    3)int * const a
    4)void T::test() const

    3、請問以下過程調用的時拷貝構造函數還是賦值運算符:(6分)

    1. class Test{…}  
    2. Test a,b;  
    3. a = b;             1)                                
    4. Test a;  
    5. Test b = a;         2)                                
    6. Test a;  
    7. Test b(a);          3)                                
    class Test{…}
    Test a,b;
    a = b;             1)                              
    Test a;
    Test b = a;         2)                              
    Test a;
    Test b(a);          3)                              

    4、請完成以下函數的填空:(9分)

    1. int binarySearch(int from, int to, int target, int *array)  
    2. {  
    3.   /* 
    4.     功能:從array中查找target,返回target在array中的下標 
    5.   */  
    6.   if(from <= to)  
    7.   {  
    8.     int middle = (from + to) /2;  
    9.     if(array[middle] == target)  
    10.                        
    11.     else if(array[middle]<target)  
    12.                        
    13.   else  
    14.                        
    15.   }  
    16.   return -1;  
    17. }  
    int binarySearch(int from, int to, int target, int *array)
    {
      /*
        功能:從array中查找target,返回target在array中的下標
      */
      if(from <= to)
      {
        int middle = (from + to) /2;
        if(array[middle] == target)
                         
        else if(array[middle]<target)
                         
      else
                         
      }
      return -1;
    }

    5、請給出以下程序的輸出:(5分)

    1. class T  
    2. {  
    3. public:  
    4.     T()  
    5.     {  
    6.         puts("T()");  
    7.     }  
    8.     ~T()  
    9.     {  
    10.         puts("~()");  
    11.     }  
    12. private:  
    13. };  
    14.   
    15. void test(T t)  
    16. {  
    17. }  
    18.   
    19. int main()  
    20. {  
    21.     T t;  
    22.     test(t);  
    23.   
    24.     return 0;  
    25. }  
    class T
    {
    public:
    	T()
    	{
    		puts("T()");
    	}
    	~T()
    	{
    		puts("~()");
    	}
    private:
    };
    
    void test(T t)
    {
    }
    
    int main()
    {
    	T t;
    	test(t);
    
    	return 0;
    }

    6、下面的代碼段有幾處錯誤,請根據程序的意圖,寫出正確的server類(10分)

    提示:這段代碼實現的功能是定期向各個server ping包,各個server對象是在不同時間創建的

    1. class Server  
    2. {  
    3.     Server()  
    4.     {  
    5.     }  
    6.     ~Server()  
    7.     {  
    8.     }  
    9.     void checkSendPing()  
    10.     {  
    11.         /* 
    12.         每隔5秒給該服務器發ping 
    13.         */  
    14.         static int lastSendPing = (int)time(NULL);  
    15.         int now = (int)time(NULL);  
    16.         if(now < lastSendPing + 5)  
    17.             return;  
    18.         //send ping to peer   
    19.     }  
    20. private:  
    21. };  
    22.   
    23. void monitorServer(std::vector<Server>& x)  
    24. {  
    25.     /* 
    26.     監控所有服務器的狀態,這個函數每秒運行一次 
    27.     */  
    28.     for(std::vector<Server>::iterator it = x.begin();  
    29.         it != x.end();++it)  
    30.         it->checkSendPing();  
    31. }  
    class Server
    {
    	Server()
    	{
    	}
    	~Server()
    	{
    	}
    	void checkSendPing()
    	{
    		/*
    		每隔5秒給該服務器發ping
    		*/
    		static int lastSendPing = (int)time(NULL);
    		int now = (int)time(NULL);
    		if(now < lastSendPing + 5)
    			return;
    		//send ping to peer
    	}
    private:
    };
    
    void monitorServer(std::vector<Server>& x)
    {
    	/*
    	監控所有服務器的狀態,這個函數每秒運行一次
    	*/
    	for(std::vector<Server>::iterator it = x.begin();
    	    it != x.end();++it)
    		it->checkSendPing();
    }

    7、(編程題)100萬個數據,數據值在0~65535之間,請用盡可能少的內存和最快的速度從小到大排序(10分)

    1. void sort(int* array, int n)  
    2. {  
    3.     //n的值在100萬左右   
    4.     //你的實現   
    5. }  
    void sort(int* array, int n)
    {
    	//n的值在100萬左右
    	//你的實現
    }

    8、(編程題)請完成如下函數,從長度爲n的數組array中刪除值等於v的元素,返回刪除後的數組array和元素個數(10分)

    1. int remove(int* array, int n, int v)  
    2. {  
    3.     //你的實現   
    4. }  
    int remove(int* array, int n, int v)
    {
    	//你的實現
    }

    9、(編程題)請看以下的Maixu結構:(15分)

    1. struct Maixu  
    2. {  
    3.     int sid;                       //id   
    4.     std::list<int> userlist:      //隊列   
    5.     int validTime;                //預定時間,每個結構不一樣,平均5分鐘左右,以秒爲單位   
    6.     int leftTime;                 //剩餘時間,以秒爲單位   
    7. };  
    struct Maixu
    {
    	int sid;                       //id
    	std::list<int> userlist:      //隊列
    	int validTime;                //預定時間,每個結構不一樣,平均5分鐘左右,以秒爲單位
    	int leftTime;                 //剩餘時間,以秒爲單位
    };

    其中隊列userlist中每一項都在預定的時間validTime後出隊,比如當前隊列是{1,2,3},validTime5秒,則5秒後1出列,隊列變爲{2,3},再過52出隊,隊列變爲{3},相應的實現代碼如下:

    1. std::vector<Maixu> m_maixus;      /*這個vector長度最多可以達到100000*/  
    2.   
    3. void Timer()              //Timer函數每秒運行一次   
    4. {  
    5.     for(std::vector<Maixu>::iterator it = m_maixus.begin();  
    6.       it !=m_maixus.end();++it)  
    7.       {  
    8.           if(it->userlist.empty())  
    9.               continue;  
    10.           if(--it->leftTime == 0)  
    11.           {  
    12.               //時間到   
    13.               it->userlist.pop_front();  
    14.               it->leftTime = it->validTime;  
    15.               //其他操作   
    16.           }  
    17.       }  
    18. }  
    std::vector<Maixu> m_maixus;      /*這個vector長度最多可以達到100000*/
    
    void Timer()              //Timer函數每秒運行一次
    {
    	for(std::vector<Maixu>::iterator it = m_maixus.begin();
    	  it !=m_maixus.end();++it)
    	  {
    		  if(it->userlist.empty())
    			  continue;
    		  if(--it->leftTime == 0)
    		  {
    			  //時間到
    			  it->userlist.pop_front();
    			  it->leftTime = it->validTime;
    			  //其他操作
    		  }
    	  }
    }

    請問上面的實現方式有沒有什麼問題?如何改進?請提出你的改進方案並重寫上面的代碼段。

    10、(思考題)有服務器S1S2…Sn100>n>50),每個服務器上維護着連接到該服務器的用戶的信息,服務器之間互相連接,當用戶信息有更新,必須通知到與它相連的其它服務器。比如S1上的用戶a改了暱稱,必須通知到S2S3…但由於網絡的不可靠,更新通知不一定每次都能到達其它服務器,假設S2丟了通知,則S2必須同步上的用戶信息,最差情況下,S2~Sn都可能同時丟了S1的通知而導致同步。

    每個服務器大概維護10000個用戶,用戶的信息結構如下,大小平均約100B:(15分)

    1. struct UserInfo  
    2. {  
    3.     int userId;        //用戶id   
    4.     string nickname;   //暱稱   
    5.     string sign;       //簽名   
    6.     //其它用戶信息   
    7. };  
    struct UserInfo
    {
    	int userId;        //用戶id
    	string nickname;   //暱稱
    	string sign;       //簽名
    	//其它用戶信息
    };

    問題:

    1) S2如何發現它丟了S1的通知?
    2) 每個服務器的帶寬限制10M/s,請給出一個可用的同步方案,保證服務器帶寬不超過限制的情況下完成同步工作;
    3) 顯然如果通知越可靠,同步將會大大減少,請提出一些能提高通知可靠性的方案並簡單說明它的實現。

  20. 9月14日,小米筆試,給一個浮點數序列,取最大乘積子序列的值,例如 -2.5, 4,0 ,3 ,0.5,8,-1,則取出的最大乘積子序列爲3,0.5,8。
  21. 持續更新,待續...2012.09.14;

    上述所有題目收集整理自或是我一些算法羣內的面試題討論,或朋友提供,或網絡帖子,由於整理匆忙,有部分題目未註明詳細來源,若以上任何一題目出自你的空間或者發的帖子而未有註明,請於本文評論中告知我,一定即刻補上,謝謝。

後記

    經過上面這麼多筆試面試題目的瞭解,你自會看到,除了少數幾個特別難的算法題,大部分都是考察的基礎,故校招筆試面試的關鍵是你的80%的基礎知識和編程能力 + 20%的算法能力。
    再強調一下開頭所述的關於筆試面試題的召集令:
  1. 如果你有好的筆試面試題,歡迎提供給我統一整理出來對於好的題目提供者,在私信:http://weibo.com/julyweibo或郵件:[email protected],裏你儘可以提出你的要求,或貼出你的微博暱稱,或個人主頁,或免費回贈編程藝術+算法研究的兩個PDF文檔:http://weibo.com/1580904460/yzpYDAuYz,以供他人借閱;
  2. 如果你對以上任何一題有好的思路或解法,更歡迎不吝分享,show me your answer or code
    當然,若你對以上任何一題有疑問,而原文中沒有給出詳細答案,也歡迎在評論中告知,我會補上,大家也可以一起討論。thank you
    OK,以上的一切都是我喜歡且我樂意做的,我願同各位朋友享受這一切.(如果你身邊有正在參加校招/筆試/面試的朋友,歡迎把此文轉給他/她,舉手之勞,助人無限),謝謝。完。July,二零一二年九月。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章