Codewars 二維數組最小值求和 Sum of Minimums! JavaScript

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. 計算出二維數組中每一行的最小值
  2. 再把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>


Codewars 二維數組最小值求和  Sum of Minimums! JavaScript

野碼無疆 - 切記心浮氣躁 。 到這裡我知道了reduce自帶累加器的好處,Math.min配合...非常好用。


分享到:


相關文章: