二维数组求平均数(每行/每列)

来源:互联网 发布:免费视频聊天的软件 编辑:程序博客网 时间:2024/06/04 18:30

              最近在学习《数据结构与算法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));





 
阅读全文
0 0
原创粉丝点击