codewars打怪日記 Greed is Good JavaScript中陣列用法和 雜湊表的使用
阿新 • • 發佈:2019-02-15
codewars是一個線上程式設計網站,其獎勵機制像打怪升級。你不能檢視高於你級別的問題的答案。除非自己通過提交測試。通過提交之後可以看到各種解法排行榜 。通過對比自己解法和排行榜對比,可以找到差距,提高能力。
描述 : greed dice 是一個骰子游戲,使用5個骰子,5個點數根據 一定的規則 算出分數,你要做的就是根據輸入的陣列點數,輸出最後的分數 。
規則如下 : 3個 1 = 1000分,3個6 = 600分,3個5=500分,3個4 = 400分,3個3 = 300分,3個2 = 200分,1個1 = 100分,1個5 = 50分。
題目應該很簡單,根據輸入的點數,統計每個點數的個數,然後根據規則計算得分。
我的程式碼:
diceR 陣列是根據下標對應個數。在官網test通過,submit有一個測試案例通不過,但是不知道輸入,到現在也沒想到原因,糾結中,求看到有興趣的私信呀<span style="font-size:18px;">function score( dice ) { // Fill me in! var score = 0 ; var diceR = [ 0,0,0,0,0,0] ; var length = dice.length ; for (var i =0 ; i < dice.length ; ++ i){ diceR[dice[i] ] += 1; } for(var index = 1;index <= diceR.length ;++ index ){ var item = diceR[index] ; if ( item > 0) { switch (index){ case 1 : score += 1000* Math.floor(item /3) + 100* (item %3);continue; case 2 : case 3 : case 6 : case 4 : score += index*100 * Math.floor(item /3) ;continue; case 5 : score += index*100 * Math.floor(item /3) + 50* (item %3); continue; default : score += 0 ;continue ; } } } return score ; }</span>
看一下排行榜第一的程式碼 :
分析 : 精妙之處 1 ,對原陣列出現個數的統計,我使用了for迴圈,這裡使用forEach函式,陣列的forEach函式,不返回值,只對每一項執行特定的函式,本質上與用for迴圈迭代陣列一樣,用自身函式,效率更高。 2 計算最終結果時,我又用了for迴圈,並且因為要判斷6中情況,所以我還嵌套了一個switch語句,簡直不能忍,這裡把的分數放入陣列,類似於雜湊表的都是用,計算個數對應的得分。 3 歸併函式的使用,reduce函式就是逐個迭代陣列所有項,然後構建一個最終返回值。用在這裡簡練精巧。<span style="font-size:18px;"> function score( dice ) { var diceR = [0,0,0,0,0,0] ; var tdr = [1000,200,300,400,500,600] ; var sdr = [100,0,0,0,50,0] ; dice.forEach(function(item){ diceR[item -1] ++ ; }) return diceR.reduce(function(prev,cur,index){ return prev + ( cur >= 3 ? tdr[index] : 0)+ sdr[index] * (cur%3) ; },0) }</span>
JavaScript提供了很多原生的方法,多練習才能更熟練的運用。