一道著名外企面試題的抽絲剝繭

2021-06-27 04:09:21 字數 1767 閱讀 2417

問題:對於乙個位元組(8bit)的資料,求其中「1」的個數,要求演算法的執行效率盡可能地高。

分析:作為一道著名外企的面試題,看似簡單,實則可以看出乙個程式設計師的基本功底的紮實程度。你或許已經想到很多方法,譬如除、餘操作,位操作等,但都不是最快的。本文一步步分析,直到最後給出乙個最快的方法,相信你看到本文最後的那個最快的方法時會有驚詫的感覺。

解答:首先,很自然的,你想到除法和求餘運算,並給出了餘下的答案:

方法1:使用除、餘操作

#include

#define byte unsigned char

int main(int argc, char *argv)

a = a / 2;

}printf("\nthe num of 1 in the byte is %d", num);

return 0;

}很遺憾,眾所周知,除法操作的運算速率實在是很低的,這個答案只能意味著面試者被淘汰!

好,精明的面試者想到了以位操作代替除法和求餘操作,並給出如下答案:

方法2:使用位操作

#include

#define byte unsigned char

int main(int argc, char *argv)

/*或者這樣計算1的個數:*/

/* for(i=0;i<8;i++)

*/printf("\nthe num of 1 in the byte is %d", num);

return 0;

}方法二中num += (a >> i) &0x01;操作的執行效率明顯高於方法一中的

if (a % 2 == 1)

a = a / 2;

到這個時候,面試者有被錄用的可能性了,但是,難道最快的就是這個方法了嗎?沒有更快的了嗎?方法二真的高山仰止了嗎?

能不能不用做除法、位操作就直接得出答案的呢?於是你想到把0~255的情況都羅列出來,並使用分支操作,給出如下答案:

方法3:使用分支操作

#include

#define byte unsigned char

int main(int argc, char *argv)

printf("\nthe num of 1 in the byte is %d", num);

return 0;

}方法三看似很直接,實際執行效率可能還會小於方法二,因為分支語句的執**況要看具體位元組的值,如果a=0,那自然在第1個case就得出了答案,但是如果a=255,則要在最後乙個case才得出答案,即在進行了255次比較操作之後!

看來方法三不可取!但是方法三提供了乙個思路,就是羅列並直接給出值,離最後的方法四只有一步之遙。眼看著就要被這家著名外企錄用,此時此刻,絕不對放棄尋找更快的方法。

終於,靈感一現,得到方法四,乙個令你心潮澎湃的答案,快地令人咋舌,演算法中不需要進行任何的運算。你有足夠的信心了,把下面的答案遞給面試官:

方法4:直接得到結果

#include

#define byte unsigned char

/* 定義查詢表 */

byte numtable[256] =

;int main(int argc, char *argv)

這是個典型的空間換時間演算法,把0~255中1的個數直接儲存在陣列中,位元組a作為陣列的下標,checknum[a]直接就是a中「1」的個數!演算法的複雜度如下:

時間複雜度:o(1)

空間複雜度:o(2n)

恭喜你,你已經被這家著名的外企錄用!老總向你伸出手,說:「welcome to our company」。 

一道著名外企面試題的抽絲剝繭

宋寶華 21cnbao 21cn.com 軟體報 問題 對於乙個位元組 8bit 的資料,求其中 1 的個數,要求演算法的執行效率盡可能地高。分析 作為一道著名外企的面試題,看似簡單,實則可以看出乙個程式設計師的基本功底的紮實程度。你或許已經想到很多方法,譬如除 餘操作,位操作等,但都不是最快的。本...

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...