填空題:
1、中序遍歷二叉樹,結果爲ABCDEFGH,後序遍歷結果爲ABEDCHGF,逆序遍歷結果爲?
2、對字符串HELL0_HULU中的字符進行二進制編碼,使得字符串的編碼長度儘可能短,最短長度爲?
3、對長度12的有序數組進行二分查找,目標等概率出現在數組的每個位置上,則平均比較次數爲?
4、一副撲克(去王),每個人隨機的摸兩張,則至少需要多少人摸牌,才能保證有兩個人抽到同樣的花色。
5、x個小球中有唯一一個球較輕,用天平秤最少稱量y次能找出這個較輕的球,寫出y和x的函數表達式y=f(x)
6、3的方冪及不相等的3的方冪的和排列成遞增序列1,3,4,9,10,12,13……,寫出數列第300項
7、無向圖G有20條邊,有4個度爲4的頂點,6個度爲3的頂點,其餘頂點度小於3,則G有多少個頂點
8、桶中有M個白球,小明每分鐘從桶中隨機取出一個球,塗成紅色(無論白或紅都塗紅)再放回,問小明將桶中球全部塗紅的期望時間是?
9、煤礦有3000噸煤要拿到市場上賣,有一輛火車可以用來運煤,火車最多能裝1000噸煤,且火車本身需要燒煤做動力,每走1公里消耗1噸煤,如何運煤才能使得運到市場的煤最多,最多是多少?
10、1,2,3,4…..n,n個數進棧,有多少種出棧順序,寫出遞推公式(寫出通項公式不得分)
11、宇宙飛船有100,000位的存儲空間,其中有一位有故障,現有一種Agent可以用來檢測故障,每個Agent可以同時測試任意個位數,若都沒有故障,則返回OK,若有一位有故障,則失去響應。如果有無限多個Agent可供使用,每個Agent進行一次檢測需要耗費1小時,現在有2個小時時間去找出故障位,問最少使用多少個Agent就能找出故障。
大題:
1、n個數,找出其中最小的k個數,寫出代碼,要求最壞情況下的時間複雜度不能高於O(nlogk)
2、寫程序輸出8皇后問題的所有排列,要求使用非遞歸的深度優先遍歷。
3、有n個作業,a1,a2…..an,作業aj的處理時間爲tj,產生的效益爲pj,最後完成期限爲dj,作業一旦被調度則不能中斷,如果作業aj在dj前完成,則獲得效益pj,否則無效益。給出最大化效益的作業調度算法。
- 人搜筆試
1. 快排每次以第一個作爲主元,問時間複雜度是多少?(O(N*logN))
2. T(N) = N + T(N/2)+T(2N), 問T(N)的時間複雜度是多少?
點評:O(N*logN) or 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。
求:不相鄰的權值和最大的邊的集合。
- 人搜面試,所投職位:搜索研發工程師:面試題回憶
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)。點評:這裏有一參考答案:http://blog.csdn.net/wumuzi520/article/details/8046350。
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模型
******************************************************************************************************************************************************
人民搜索的筆試題
1、打印漢諾塔移動步驟,並且計算複雜度
2、計算兩個字符串的是否相似(字符的種類,和出現次數相同)
3、定義二叉樹,節點值爲int,計算二叉樹中的值在[a,b]區間的節點的個數
4、動態規劃題:一條路有k可坑,每次能跳平方數步長(1 4 9 16。。),不能跳到坑裏,從a跳到b最少幾步?
5、給一個整數數組,求數組中重複出現次數大於數組總個數一半的數。
1、對以孩子兄弟鏈接的樹進行遍歷,不能用遞歸,也不能借助任何輔助空間
2、假設數組B是升序Int數組A循環移若干得到的位,實現對數組B進行查找的高效算法
3、只有整數和+-*/四種運算組成的算術表達書,實現其求值
4、還有一個是考貪心算法的,你讓他們看算法導論那本書,關於fractional knapsack problem的那一段,就是0-1揹包的一種變形;
5、鏈表相鄰元素翻轉,如a->b->c->d->e->f-g,翻轉後變爲:b->a->d->c->f->e->g
6、求正整數n所有可能的和式的組合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2)
1、實現一個atoi函數==>'注意正負號的判定'
2、翻轉一個句子,其中單詞是正序的==>兩次旋轉
3、二叉樹兩個結點中的最小公共子結點==>求長度,長度之差,遠的先走,再一起走
4、三角陣中從第一行到最後一行(給出搜索方向的限制)找一個連續的最大和==>廣度優先搜索√
5、實現一個STL中的vector中的儘量多的方法。
6、字符串移動(字符串爲*號和26個字母的任意組合,把*號都移動到最左側,把字母移到最右側並保持相對順序不變),要求時間和空間複雜度最小。
- /**
- ** author :hackbuteer
- ** date :2012-10-03
- **/
- void Arrange(char *str ,int n)
- {
- int i , k = n-1;
- for(i = n - 1 ; i >= 0 ; --i)
- {
- if(str[i] != '*')
- {
- if(str[k] == '*')
- {
- str[k] = str[i];
- str[i] = '*';
- }
- --k;
- }
- }
- }
- /**
- ** author :hackbuteer
- ** date :2012-10-03
- **/
- void Arrange(char *str , int n)
- {
- int i , k = n-1;
- for(i = n - 1 ; i >= 0 ; --i)
- {
- if(str[i] != '*')
- {
- if(str[k] == '*')
- {
- str[k] = str[i];
- str[i] = '*';
- }
- --k;
- }
- }
- }
/**
** author :hackbuteer
** date :2012-10-03
**/
void Arrange(char *str , int n)
{
int i , k = n-1;
for(i = n - 1 ; i >= 0 ; --i)
{
if(str[i] != '*')
{
if(str[k] == '*')
{
str[k] = str[i];
str[i] = '*';
}
--k;
}
}
}
7、說說outer join、inner join、left join、right join的區別是什麼?
內連接:進行連接的兩個表對應的相匹配的字段完全相同的連接。join
外連接又分爲左外連接和右外連接。
左連接即LEFT OUTER JOIN:
兩個表進行左連接時會返回左邊表中的所有的行和右邊表中與之相匹配的列值沒有相匹配的用空值代替。
右連接即RIGHT OUTER JOIN:
兩個表進行右連接時會返回右邊表中的所有的行和左邊表中與之相匹配的列值沒有相匹配的用空值代替。
我們建立兩張表,students、class並插入測試數據
students
---------------------------
id name classId
1 name1 1
2 name2 null
3 name3 2
---------------------------
class
-----------------------
id name
1 class1
2 class2
3 class3
-----------------------
實驗結果如下:
mysql> select s.name,c.name from students s join class c where s.classId=c.id ; (注:inner join和join一樣)
+-------+-------+
| name | class |
+-------+-------+
| name1 | 1 |
| name3 | 2 |
+-------+-------+
2 rows in set
mysql> select s.name,c.name from students s left join class c on s.classId=c.id ; (left join 和 left outer join 一樣)
+-------+-------+
| name | class |
+-------+-------+
| name1 | 1 |
| name2 | NULL |
| name3 | 2 |
+-------+-------+
3 rows in set
mysql> select s.name,c.name from students s right join class c on s.classId=c.id ; (right join 和 right outer join 一樣)
+-------+-------+
| name | class |
+-------+-------+
| name1 | 1 |
| name3 | 2 |
| NULL | 3 |
+-------+-------+
3 rows in set