[編程題]記一下騰訊2017年在線筆試題編程題的思路


三道題拿分都不難,不過這個在線網頁擼代碼的熟練度還得再提高一下(做的時候C的調試有時候不靈光, Python編輯器的自動縮進功能肯定有bug...)。

 

第一題是給四個數A,B,C,D, 給兩種變換操作: 第一種: A, B同時+1, 第二種, A, B同時乘2。問最少幾次操作后可以把A和B同時恰好變換成C, D, 沒有變換方法就輸出-1。

 

這道題應該是可以推數學表達式的,應該存在O(logn)甚至O(1)的方法。不過考試拿分起見,就先寫一個dfs模擬。

 

具體寫法就是dfs(A_tmp, B_tmp, level),遞歸調用dfs(A_tmp + 1, B_tmp + 1, level + 1) 和dfs(A_tmp * 2, B_tmp * 2, level + 1)。全局維護一個最小操作數,並做好剪枝工作,就可以順利拿分了。

 

第二題,題目就是有[1,1,2,2,4,4,..., 2^18, 2^18] ,即從2^0到2^k恰好每個數有兩個的可用因子,給一個目標整數N,問從這些因子里部分累加,可以湊成N的總的組合數量。

這題應該算是整數划分題,不太明白的同學可以搜搜“整數划分”或者看郭煒老師的慕課的DP部分找找感覺。

 

但是...我也對這個題型有點生疏了,就想先用dfs試試看。

 

同樣,為了拿分,就先生成一個長度38的數組arr,里面放[1,1,2,2,...2^18, 2^18]。需要指出的是C語言里這里要用long long。

 

然后做dfs模擬,dfs(i)代表取arr[i]作為因子,全局維護一個cntTmp,調用就加return前減。當cntTmp< target(目標和)時遍歷dfs(i + 1) 到dfs(37)。

 

此外還需要記錄dfs路徑,構造一個哈希函數,做哈希和校驗,以防止dfs搜出重復路徑。

 

同樣,做好剪枝工作,復雜度看着很高啊O(2^(2k))?(是不是啊同志們,這里我沒把握)。。。(k有18也太高了)

 

然后我發現我的頁面的debug系統掛了,輸出永遠是空,我覺得服務器那邊一直就只收到了一個默認代碼,這種的:

int main() {return 0;}

Ctrl+F5都救不回來。。。

 

第三題,給了一個圖。求節點0到節點1的最短路。多加了了一個變量k(打對折的機會),意思是在每次走一個edge的時候有機會把edge的cost減半,共k次機會。

 

那么維護的狀態cost[i]就變成了cost[i][j],意思是到達i且花費了j次打折機會的最小cost。

 

本來想快速寫一個Bellman-Ford朴素最短路過樣例再說,復雜度在O(k * n^2)。

無奈在第二題用時太長了,導致這題只留了10分鍾,沒有成功寫出能過樣例的代碼。

 

最后,祝大家擼題愉快,找工作順利。

就這樣,以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM