概述
最近在学习《数据结构与算法javascript描述》,发现里面有个二维数组求平均数的那个地方好像有一点问题,可能是我看的是盗版PDF吧,在求每一行【平均数的时候没考虑到数组元素有为0的情况,在求每一列平均数的时候代码就是错误的,所以我自己尝试重新实现一次;
求二维数组每行平均数:
每行求平均数我们只需要注意有0存在的情况即可;
var grades = [[1,2],[3,0,4],[5,6,7]];
var grades1=[0,1,2,3,4,5];
/*
[1,2]
[3,0,4]
[5,6,7]
*/
/*
求二维数组每行平均数函数
*/
function averagePerRow(arr){
var average = 0;
var len=arr.length;
var divisor=len;
var tmpArray=new Array();
for(var i=0;i<len;i++)
{
tmpArray.push(calPerRow(arr[i],arr[i].length))
}
return tmpArray;
}
/*
求一维数组平均数函数
*/
function calPerRow(arrRow,arrRowLen) {
var divisor=arrRowLen||arrRow.length;
var totalRow=0;
for(var i=0;i<divisor;i++)
{
totalRow+=arrRow[i];
}
for(var j=0;j<divisor;j++)
{
if(arrRow[j]==0)
{
divisor-=1;
}
}
return totalRow/divisor;
}
console.log(averagePerRow(grades))
console.log(calPerRow(grades1))
求二维数组每列平均数:
这个必须好好说一下,在实现的时候卡克了很久;关键点在于长度不一样的数组如何去求每列的和;
我的想法是把行列进行置换,然后再用求每行平均数的方法去求;
但是行列置换又是一个难点,关键还是在于每个数组的长度不一样(列数),我想的思路是求出二维数组中最大的那个数组的长度,然后让其他数组长度都为这个(不够的赋值0),然后进行行列置换;可以看成M*N的矩阵;
But!! 有一个大佬的思路是下面的,比我更简洁,而且代码量极少!~而且全部用ES6的语法写出来的,╮(╯▽╰)╭ 大牛就是大牛,然后仔细读了他的代码,当然借助了这个网站,在线将ES6转换为ES5;
https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&targets=&browsers=&builtIns=false&debug=false&code_lz=Q
下面就是大牛的代码,实现的功能是把数组进行行列置换;
var arr = [
[1, 2, 6,11,16],
[3, 0, 4],
[5, 6, 7,12],
[8, 9, 10]
]
var result = Array(Math.max(...arr.map(e =>e.length)))
.fill("")
.map((_e, outerIndex) => arr.map((e, innerIndex) => e[outerIndex])
.filter(ele => ele !== undefined));
//不知道大家看懂他的代码没,下面我就按照自己的理解解释一下;
//思路:
/*目标
[1, 2, 6,11,16], [1,3,5,8]
[3, 0, 4], [2,0,6,9]
[5, 6, 7,12], ==> [6,4,7,10]
[8, 9, 10] [11,12]
[16]
(1)生成需要输出的数组
["","","","",""]
(2)生成M*N “矩阵”
[1,3,5,8]
[2,0,6,9]
[2,0,6,9]
[6,4,7,10]
[11,undefined,12,undefined]
[16,undefined,undefined,undefined]
(3) 去除"undefined"
[1,3,5,8]
[2,0,6,9]
[2,0,6,9]
[6,4,7,10]
[11,12]
[16]
(4)将最后结果填入刚生成的数组
[
[1,3,5,8],
[2,0,6,9],
[2,0,6,9],
[6,4,7,10],
[11,12],
[16],
]
*/
我自己又仿照他的思路用ES5的语法又实现了一遍,最终可以把每列的平均数求出来~
var arr = [
[1, 2, 6,11,16],
[3, 0, 4],
[5, 6, 7,12],
[8, 9, 10]
]
function getSum(total, num) {
return total + Math.round(num);
}
function averageColRow(arr){
var Max=0;
arr.map(function(item){
Max=Math.max(Max,item.length);
})
var result=Array(Max).fill("")
.map(function(_e,outerIndex){
return arr.map(function(e,innerIndex,input){
return e[outerIndex]
}).filter(function(ele){
return ele!==undefined
})
});
var permutationArray=result.map(function(item){
{
return item.filter(function(ele){
return ele!=0;
})
}
})
return permutationArray.map(function(item){
return item.reduce(getSum,0)/item.length;
})
}
console.log(averageColRow(arr));
最后
以上就是机智小蘑菇为你收集整理的二维数组求平均数(每行/每列)的全部内容,希望文章能够帮你解决二维数组求平均数(每行/每列)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复