和資料結構一樣,演算法的面試題也備受面試官的青睞,其中排序和查詢是面試是考察演算法的重點。
在準備面試的時候應該重點掌握二分查詢、歸併排序和快速排序,做到能隨時正確、完整地寫出它們的**。
查詢和排序都是在程式設計中常用到的演算法。查詢相對而言較為簡單,不外乎順序查詢、二分查詢、雜湊表查詢和二叉排序樹查詢。在面試的時候,不管用迴圈還是用遞迴,面試官都期待應聘者能夠寫出完整正確的二分查詢**。。。
雜湊表和二叉排序樹查詢的重點在於考查對應的資料結構而不是演算法。雜湊表最主要的優點是我們利用它能夠在o(1)時間查詢某一元素,是效率最高的查詢方式。但其缺點是需要額外的空間來實現雜湊表。
與二叉排序樹查詢演算法對應的資料結構是二叉搜尋樹。
排序比查詢要複雜一些。面試官會經常要求應聘者比較插入排序、氣泡排序、歸併排序、快速排序等不同演算法的優劣。強烈建議應聘者在準備面試的時候,對各種排序演算法的特點記牢,能夠從額外空間消耗、平均時間複雜度和最差時間複雜度等方面去比較它們的優缺點。需要強調的是,很多公司的面試官喜歡在面試環節中要求應聘者寫出快速排序的**。
實現快速排序演算法的關鍵在於先在陣列中選擇乙個數字,接下來把陣列中的數字分為兩部分,比選擇的數字小的數字移到陣列的左邊,比選擇的數字大的數字移到陣列的右邊。
下面的函式可以實現此項功能
int partition( int data, int
length, int start, int end )
}++small;
swap( &data[small], &data[end] );
return small;
}void quicksort( int data, int
length, int start, int end )
不同的排序演算法使用的場合也不盡相同。快速排序雖然總體的平均效率是最好的,但也不是任何時候都是最優的演算法。比如,陣列本身已經排好序了,而每一輪排序的時候都是以最後乙個數字作為比較的標準,此時快速排序額效率只有o(n^2)。因此在這種場合快速排序就不是最優的演算法。在面試的時候,如果面試官要求實現乙個排序演算法,那麼應聘者一定要問清楚這個排序應用的環境是什麼、有哪些約束條件,在得到足夠多的資訊之後再選擇最合適的排序演算法。
面試官:請實現乙個排序演算法,要求時間效率o(n)則,**如下應聘者:對什麼數字進行排序,有多少數字?
面試官:我們相對公司所有員工的年齡排序。公司有幾萬名員工。
應聘者:也就是說數字的大小是在乙個較小的範圍之內的,對吧?
面試官:恩,是的
應聘者:可以使用輔助空間嗎?
面試官:看你用多少輔助記憶體。只允許使用常量大小輔助空間,不得超過o(n)。
void sortages( int ages, int length )
intindex =0;
for( int i=0; i<=oldestage; ++i )
}}
劍指offer(演算法和資料操作篇)
class solution defminnumberinrotatearray self,rotatearray if len rotatearray 0 return 0 front 0 rear len rotatearray 1 minval rotatearray 0 if rotatea...
資料結構和演算法 劍指offer 替換空格
請實現乙個函式,將乙個字串中的每個空格替換成 20 解題思路 原地排序 1.將字串設為足夠大的容量可以放入替換後的字串 2.從尾部開始插入 3.採用setcharat 函式替換字元 public class solution 重新設定新字串的長度 int newlen len count 2 str...
資料結構(劍指offer)(堆疊)(python)
定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 時間複雜度應為o 1 思路 用空間換時間,用乙個輔助棧記錄當前棧中的最小值。輔助棧元素個數和資料棧保持一樣的數目。例如一次壓入資料棧數字串行為 3,2,4,1,5 那麼一次壓入輔助棧的為 3,2,2,1,1 當每次壓入資料棧...