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配合...非常好用。


分享到:


相關文章: