試著解一道騰訊面試題

2021-04-21 11:23:07 字數 4553 閱讀 6920

帖子問題:

(同學去面試的)

1、設計乙個魔方(六面)的程式。

2、有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有重複。請用5分鐘時間,找出重複出現最多的前10條。

3、收藏了1萬條url,現在給你一條url,如何找出相似的url。(面試官不解釋何為相似)

想了一中午,寫了一下午(真服了自己,這麼鑽牛角尖,汗~),成果如下:

重點第2題,我的解法如下:

思路:由於大量的資料,同時基於儲存條件限制,盡量利用二分法,然後採用hash/binary結構,盡量避免迴圈。

------------------------------ logic & steps ------------------------------

/** 1. 對於1000萬條儲存在[硬碟, 文字檔案]的簡訊記錄,則設-> n = 10,000,000 (10 million)

* 2. 已知一條簡訊的長度是0 - 70 字元之間(最多70個字母,35個漢字),則設-> arraylistsms[70] (1-70個不同長度,空簡訊另計)

* * 3. 取 (第乙個) 字元的[最後一位(bit)],為其建立-> arraylistbitfirstchar (取值0, 1)

* 4. 取 (最後乙個) 字元的[最後一位(bit)],為其建立-> arraylistbitlastchar (取值0, 1)

* 5. 取((長度+1)除2) 字元的[最後一位(bit)]((i+1)/2),為其建立-> arraylistbitmidchar (取值0, 1)

* * 6. 檢查 (第乙個) 字元[byte],為其建立-> dictionary hashfirstcharacter(首字相同放一起)

* 7. 檢查 (最後乙個) 字元[byte],為其建立-> dictionary hashlastcharacter(末字相同放一起)

* 8. 檢查 ((長度+1)除2) 字元[byte],為其建立-> dictionary hashmidcharacter(中間字相同放一起)

* * 9. 全文[string]比較,為其建立-> dictionary hashsms(最終計數)

** 10. 維持乙個全域性 dictionarytopsms 遍歷檢驗topsms[i]中計數最小的string和當前更新的hashsms[string]的大小,小則替換,否則無操作?或者最後再檢查取前十???(這個我沒考慮哪個時間開銷更小)

*/------------------------------ logic & steps ------------------------------

/** topmostsmsreader pseudocode (c# version)

* this is a demo for reading top most sms (or alike) strings from files. partial code are pseudocode

** author: leemax li

* created: 2008.11.03

* email: [email protected]

* last modify: 2008.11.03 by leemax li

*/public

class leemaxtopmostsmsreader implements idisposable 

// main entry

public dictionarylong> checknow(string filename, long maxline) 

if (sms[nowsms.length].bitfirstchar[0 or 1].bitlastchar[0 or 1].bitmidchar[0 or 1].hashfirstcharacter[nowsms[0]].hashlastcharacter[nowsms[nowsms.length - 1]].hashmidcharacter[nowsms[(nowsms.length + 1) / 2]].hashsms.haskey(nowsms))

else

//currentcount = sms[nowsms.length].bitfirstchar[0 or 1].bitlastchar[0 or 1].bitmidchar[0 or 1].hashfirstcharacter[nowsms[0]].hashlastcharacter[nowsms[nowsms.length - 1]].hashmidcharacter[nowsms[(nowsms.length + 1) / 2]].hashsms[nowsms].value;   // low efficiency

//checktopsms(nowsms, currentcount);   // low efficiency

}checkouttops();

}catch (exception ex) 

finally 

return _topsms;

}private

void checkouttops() 

// this is not good, should check out after all cleared out

/*private void checktopsms(string newstring, long newcount) }}

// no match found, check the smallest

if (currentsmallest < newcount) }*/

// implementation of idisposable

public

void dispose() 

// attributes and others

public

int returnlength

set 

}public

long currentline

}public

long currentemptysmscount}}

------------------------------ possible solution code ------------------------------

------------------------------ analysis -----------------------------

/** 根據 logic & steps 中的設計

* 1. n0 = 10,000,000 (10 million) (硬碟讀取時間)

* 2. sms[70]  (不需要遍歷, n1 = 10 million / 71 < 140846)

* * 3. 取 (第乙個) 字元的[最後一位(bit)],bitfirstchar (cpu時間,不需要遍歷, n2 = n1/2 < 70423)

* 4. 取 (最後乙個) 字元的[最後一位(bit)],(cpu時間,不需要遍歷, n3 = n2/2 < 35212)

* 5. 取((長度+1)除2) 字元的[最後一位(bit)]((i+1)/2),(cpu時間,不需要遍歷, n4 = n3/2 < 17606)

* * 6. 檢查 (第乙個) 字元[byte],hashfirstcharacter(首字相同放一起)(設為 m = n4)

* 7. 檢查 (最後乙個) 字元[byte],hashlastcharacter(末字相同放一起)(設為x = n4/ln(n4))

* 8. 檢查 ((長度+1)除2) 字元[byte], hashmidcharacter(中間字相同放一起)(設為y = n4/(ln(n4)*ln(x)))

* * 9. 全文[string]比較,hashsms(最終計數)(設為z = n4/(ln(n4)*ln(x)*ln(y)))

** 10. 維持乙個全域性 topsms 遍歷檢驗(每次檢查為:n0*ln(fetchcount)次, 最後遍歷 <= n4次)

** 時間代價為:o(program): lnm*lnx*lny*lnz

n = 10000000

m = 71428.571428571428571428571428571

lgm = 11.176453228349015489585363863205

x = 6390.9873704292188700245451792576

lgx = 8.7626440534989345490873775956615

y = 729.34462833478780320337939734221

lgy = 6.5921463615017245913923031187162

z = 110.63841552338339979745756356137

lgz = 4.7062673662433216260688480137905

total cost = lgm * lgx * lgy * lgz

= 3038.3836675663354054154917591655*/

------------------------------- analysis ------------------------------

一道騰訊面試題

view plainprint?已知有個rand7 的函式,返回1到7隨機自然數,讓利用這個rand7 構造rand10 隨機1 10。using system using system.collections.generic using system.linq using system.text ...

一道面試題

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

一道面試題

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