幾個筆試題分析

2021-05-05 00:00:49 字數 1672 閱讀 6793

一位網友說參加了迅雷的筆試,題目在這裡:

第一道是將一幅牌隨機發給四個玩家。lz對這個問題有這樣的乙個描述:

我的想法就是窮舉52張撲克牌分4份的所有可能,並儲存起來,然後rand()%(可能性數目)產生乙個索引,索引到對應的某種可能性。這種概率問題似乎可用遞迴方式解決?這個演算法在撲克遊戲裡應該經常用到。

52張牌分四份有多少種可能呢?

上過高中的人都應該知道的吧,共有,整理一下為52!/(13!)^4,用系統自帶的計算器算一下的結果是

53644737765488792839237440000.021,忽略小數點。到這裡我們就可以否定lz的這個想法了。

其實stl中有個函式random_shuffle(begin, end);可以將容器中的從begin 到end的資料打亂,用這個函式將1~52打亂後按順序發給每個玩家就可以了。這個函式的原來是什麼?你可以看一下原始碼。這裡我引用http://bbs.pediy.com/showthread.php?t=55582中的分析:

程式中設定乙個變數,記住末發牌數,假設為n,每次發牌時,就是在 0...(n-1) 的範圍內產生乙個隨機數,這個隨機數就是記憶體中那幅牌中的第幾張牌,然後將這張牌抽出,發給玩家後,再將餘下牌中的最後一張牌(索引號:n-1)放到這張牌的位置上來。

這樣,產生的隨機數雖然可能相同,那只是表示要抽取的牌的位置是相同的,由於牌已經被更換,所以每次抽取的牌肯定是不一樣的。

這是widows自帶的小遊戲紅心大戰中的發牌演算法,很精妙,原帖作者是看著彙編**分析的,這還挺有耐心的。產生隨機數還是要用52次。筆試題中說「已有隨機整數生成函式rand(),但開銷較大」,言下之意是要少用了,那怎麼辦?微軟都這樣用了,我就無視這個限制好了。

第二題,將乙個字串逆轉,如"hello"變成"olleh",不許呼叫任何已有的字串庫函式,要求盡量高效,以及占用盡量少的儲存空間。

其實就是不用中間變數將兩個整數型或字元型變數交換。你可以用+活*來完成,數值太大的話可能會溢位,所以用異或^來操作最好了,引用一位回帖的**:

void

swap( unsigned

char

&l, unsigned

char

&r )

void

invert( unsigned

char

*str,

const

unsigned

intlength )

}

第三個題,有10億個無符號整數儲存在檔案中,取值範圍是0-1000萬,給定值value返回大於該數的個數。完成以下類函式的實現:

class order_calculator

已有函式get_value_by_index(unsigned index)根據index索引值返回值可以呼叫,但此函式開銷較大。

在檔案中的資料是無序的,那麼只能遍歷了吧,資料量比較多,可以分幾次載入到記憶體。有序的話二分查詢第乙個大於value的值,馬上就可以根據下標算出所有大於value的數的個數了。如果把這些資料載入到資料庫中,那對於我們來說這個任務就是乙個select語句的問題了,呵呵~~

幾個筆試題

試題一 float型別的數能否進行 等二進位制運算?試題二 給定乙個單鏈表,判斷該單鏈表是否是回文單鏈表,要求時間複雜度為o n 空間複雜度為o 1 試題三 給定乙個數n,寫乙個程式計算,小於或等於n的非負整數中所含數字1的個數,例如當n為13時,返回值為6,分別出現在1 10 11 12和13中,...

幾個筆試題

1 程序間的通訊方式?管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,...

幾個阿里筆試題

1.var data var result object.keys data filter function x console.log result c d 解釋 object.keys 以陣列的形式輸出可列舉的屬性名,在此題中object.keys data 返回 a b c d filter ...