2013 5 12搜狐實習生筆試題 編碼題部分

2022-05-01 03:00:08 字數 2593 閱讀 6890

1.利用堆排序對陣列進行排序。

堆結構是把陣列看成完全二叉樹,除最後一層,每一層都是滿的。堆分最大堆和最小堆,其中最大堆是指每乙個子樹中,根要比其兩個孩子的值大,最小堆反之;陣列元素公升序需要用最大堆,降序用最小堆;這裡使用最大堆。

實現堆排序需要三個主要函式:建立最大堆,維持最大堆性質,和堆排序函式。

建立最大堆(buildmaxheap):自底向上地維持最大堆性質,heapsize/2為最底下一層的父結點,即需要從結點下標為heapsize/2 ~ 0的結點呼叫維持最大堆性質的函式(maxheapify)。

維持最大堆性質(maxheapify):將堆中某個元素調整到合適的位置(下沉);使之滿足最大堆性質。

堆排序函式(heapsort):將堆頂(該堆的最大值)和堆底交換,並將heapsize減1,再呼叫函式使目前的堆維持最大堆性質。

code:

1

void swap(int *a, int i, intj)2

7//維持最大堆性質

8void maxheapify(int *a, int i, int

heapsize)918

//else

19//

22//

if (a[i] < a[nlargrindex])

23//

28//

非遞迴版本

29int child; int

tmp;

30for (tmp = a[i]; heapsize > 2 * i + 1; i =child)

3138

//若當前的父親比孩子小,則交換

39if (tmp

4043

else

44break;45

}46 a[i] = tmp;//

把原父節點放到合適的位置上47}

2.已知rand7()生成1~7的隨機數,寫出rand10()。

思想:利用進製的方法生成進製位上的元素,選擇輸出指定的範圍。ps:直接擴充的方法產生的每個數概率不相等,中間的數概率會高些。

code:

1

//產生範圍1~10

3.設計演算法,實現乙個對陣列左移k個元素的函式,要求時間複雜度為o(n)。

此題在programming pearls column2有相應介紹。主要思想是利用等式(arbr)r = ba,r表示reverse,例如序列,現在陣列左移3位得到的結果為;利用前面介紹的等式,把原序列中的前3位,和剩下一部分分別反轉,於是得到,再整體反轉一次得到即為最終結果。反轉的時間複雜度為o(n),故滿足題意,而且不需要額外的記憶體空間。

code: 

1

//對陣列a 指定範圍反轉元素

2 template

3void reverse(t *a, int nstart, int

nend)412

}13 template

14void leftmovekthelements(t *a, int k, int

n)15

例項:

4.用最快的演算法列印1~n的素數。

思路:用篩選法和位運算。利用乙個unsigned int的位數可代表32個數,於是n個元素只需要1+ n/32個unsigned int就夠了。

篩選法:遍歷2~sqrt(n),把2~sqrt(n)的倍數 對應的位設為0(異或操作^)。 輸出時把2~n對應位數非0的數輸出即可。

1

void printprime(unsigned intn)2

10for (int i = 0; i < 1 + n / 32; ++i)

1114

for (int i = 2; i < nsize; ++i)

1523}24

}25int j = 0;26

for (int i = 2; i <= n; ++i)

2737}38

39}40free(narray);

41 narray =null;

42 }

下面是列印1~1000的素數

2010實習生筆試題

1.已知兩個鍊錶head1和head2各自有序,請把它們合併成乙個有序鍊錶,要求用遞迴方法進行。cpp view plain copy include include using namespace std struct node node make link void display node v...

實習生筆試

這幾天參加過幾場筆試。讓我對筆試有了新的認識。無論是前端,還是後端,最開始的筆試都只是乙個簡單的測試,測試你的邏輯思維能力,演算法能力。單項選擇題基本上是一些計算機的基礎題目,包括網路協議 http tcp ip 記憶體 暫存器。程式的設計。而程式設計題目是一些簡單的演算法題目,不會太難,但是反映的...

騰訊實習生筆試題

一 單項選擇題 1 給定3個int型別的正整數x,y,z,對如下4組表示式判斷正確的選項 int a1 x y z int b1 x y z int a2 x z y int b2 x z y int c1 x z int d1 x y z int c2 x z a a1一定等於a2 b b1一定定...