Codewars介紹
Codewars 是我比較喜歡的在線練習代碼的平臺。它彷彿有一種練武功的感覺。每個問題都有自己難度總共有8個級別,就像任務的難度一樣。每個難度給的積分也不同。隨著積分的增加,自己的等級改變,不過等級是倒過來的,平臺裡叫kyu(也就是段位),段位越低越厲害,一開始是8kyu。
題目描述
Given a 2D array of size m * n. Your task is to find the sum of minimum value in each row.
(給你一個二維數組 m*n,你的任務是計算出每一行的最小值並求和)
For Example:
<code>\t[
[1, 2, 3, 4, 5], // minimum value of row is 1
[5, 6, 7, 8, 9], // minimum value of row is 5
[20, 21, 34, 56, 100] // minimum value of row is 20
]/<code>
So, the function should return 26 because sum of minimums is as 1 + 5 + 20 = 26
(那麼,既然1+5+20=26,函數就應該返回26)
Note: You will be always given non-empty array containing Positive values.
(注意:給你的數組永遠都是非空並且是正數的值)(由於題相對簡單,出題者幫助省去的對於空數組的判斷)
分析
簡單做個問題的分解吧。
- 計算出二維數組中每一行的最小值
- 再把1裡計算出的結果相加就可以了
解答
<code>function sumOfMinimums(arr) {
let sum = 0;
// ^_^ 習慣性的一行帶過了。當然這裡用Array自帶的sort排序處理會浪費些性能。可以自己寫個遍歷取最小值的函數。
arr.map( list => sum += list.sort()[0] )
return sum
}
/<code>
乍一看沒有問題,其實這裡有一個經常會犯又經常忘的錯誤。就是 Array.prototype.sort() 到底是怎麼判斷大小來排序的。事實上它把每一個輸入當作字符串並且取第一位換成ASCII來進行比較。也就是說 ['a','A'].sort() 也可以運行並且會輸出反過來的結果。
把上面的代碼改成下面就可以成功完成這道題目。我想Array.sort 單獨拿出來也能說不少呢 ^_^ 。
<code>arr.map(list=>sum+=list.sort((a,b)=>a-b)[0])/<code>
並沒有結束
Codewars 在每成功完成一道題後會看到 這道題目的所有解答。然後可以給每個解答點贊評論。這裡可以收穫到非常多的知識。然後就會意識到自己還是菜的很呀。比如下面我們拿一個解法分析分析。
<code>function sumOfMinimums(arr) {
return arr.reduce((sum,value)=>sum+Math.min(...value),0)
}/<code>
知識點
Array.prototype.reduce 函數到底該怎麼使用,這裡給權威的mdn鏈接。
簡單來說 reduce也會遍歷數組 ,表述為 reduce( (累積器,當前值) => 返回值 ,初次迭代使用的值) 如果沒有指明初次迭代使用的值那麼第一次的累積起值是 數組的第一個值,並且(這裡需要注意)第一次調用的當前值也會變為數組第二個值。這就意味著在沒有指定初次迭代使用值的情況下,會少調用一次^_^。當然要多練習使用自己就明白了。
Math.min() 在加上展開運算符 ... 非常簡便的計算數組最小值的方式,對比寫 for 循環來計算最小代碼精簡很多,非常簡便。
<code>https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce/<code>
野碼無疆 - 切記心浮氣躁 。 到這裡我知道了reduce自帶累加器的好處,Math.min配合...非常好用。
閱讀更多 野碼無繮 的文章