一道筆試題的解法和聯想

2021-09-20 13:53:19 字數 1029 閱讀 1420

(注:這裡只是想通過排序演算法來描述一下抽象的過程,所以大家不要太關注於陣列的排序)

原題是這樣的,請用c#編寫乙個可以對任意型別進行氣泡排序演算法,我們先看乙個整型的氣泡排序來了解一下氣泡排序:

這個題其實考的重點並不在氣泡排序(當然不懂氣泡排序肯定不行),而是考一種抽象能力,對於氣泡排序來說,任意型別排序他們共同的東西就是氣泡排序的思想,而不同的部分在比較上,所以我們就要想一種方法將變化的部分和不變的部分隔離開,我們首先想到的方法是使用介面,下邊是一種解法:

這個解法可以應對更多的型別排序,只要這些需要排序的型別都實現iarray介面就可以了,但是問題是如果這樣,這個排序演算法又不支援整型了,我們總不能為了這個排序演算法重新封裝一下整型吧。我們得繼續尋找辦法,於是我們想到了系統的乙個介面icomparable,這個介面定義通用的比較方法,由值型別或類實現以建立型別特定的比較方法。系統自定義型別幾乎都實現了這個介面,所以只要自定義類也實現這個介面就可以利用到這裡了,**如下:

現在基本符合題意了,但看起來好像還不是好的解決方案,因為每個型別都要實現icomparable仍然是個限制,那如何打破這個限制呢,仔細想想,我們想出另外乙個解決方案,就是想辦法把比較方式封裝起來,然後呼叫排序函式時傳進來不就成了麼。

大家可能覺得這個和上乙個方案很象阿,不都要實現乙個介面麼,其實後乙個方案中的最大優點在於你自定義類不用繼承任何介面了,我們想一下,為了讓某個型別支援這個氣泡排序而去實現乙個介面是很牽強的。.net對陣列,集合等的排序就是使用這個方法來做的,大家可以研究一下array類中的靜態方法public static void sort(array array, icomparer comparer);。那這個是不是最好的解決方案呢,我們本著不撞南牆不回頭的原則繼續前進,這個介面好像用委託也可以實現吧,那寫個版本先:

似乎也沒有什麼改進,還要寫多寫乙個方法,但是這個委託版本已經基本接近我們的答案了,下面我們使用lambda表示式來實現我認為的最優的答案(這個答案中需要大家了解lambda表示式,范型以及func委託):

ps:有網友問,不同型別排序怎麼辦,我覺得一樣是需要把比較的方式和排序演算法本身分離開來,我寫了個簡單例子供參考

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...