1.利用堆排序對陣列進行排序。
堆結構是把陣列看成完全二叉樹,除最後一層,每一層都是滿的。堆分最大堆和最小堆,其中最大堆是指每乙個子樹中,根要比其兩個孩子的值大,最小堆反之;陣列元素公升序需要用最大堆,降序用最小堆;這裡使用最大堆。
實現堆排序需要三個主要函式:建立最大堆,維持最大堆性質,和堆排序函式。
建立最大堆(buildmaxheap):自底向上地維持最大堆性質,heapsize/2為最底下一層的父結點,即需要從結點下標為heapsize/2 ~ 0的結點呼叫維持最大堆性質的函式(maxheapify)。
維持最大堆性質(maxheapify):將堆中某個元素調整到合適的位置(下沉);使之滿足最大堆性質。
堆排序函式(heapsort):將堆頂(該堆的最大值)和堆底交換,並將heapsize減1,再呼叫函式使目前的堆維持最大堆性質。
code:
1void 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下面是列印1~1000的素數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 }
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一定定...