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

时间:2024-11-16 18:23:39

              最近在学习《数据结构与算法javascript描述》,发现里面有个二维数组求平均数的那个地方好像有一点问题,可能是我看的是盗版PDF吧,在求每一行【平均数的时候没考虑到数组元素有为0的情况,在求每一列平均数的时候代码就是错误的,所以我自己尝试重新实现一次;

 

求二维数组每行平均数:

每行求平均数我们只需要注意有0存在的情况即可;

  1. var grades = [[1,2],[3,0,4],[5,6,7]];  
  2. var grades1=[0,1,2,3,4,5];
  3. /* 
  4.     [1,2] 
  5.     [3,0,4] 
  6.     [5,6,7] 
  7. */   
  8. /*
  9. 求二维数组每行平均数函数
  10. */
  11. function averagePerRow(arr){  
  12.     var average = 0;  
  13.     var len=arr.length;  
  14.     var divisor=len;  
  15. var tmpArray=new Array(); 
  16.     for(var i=0;i<len;i++)  
  17.      {  
  18.          tmpArray.push(calPerRow(arr[i],arr[i].length)) 
  19.      }  
  20. return tmpArray;
  21. }  
  22.  
  23.  /*
  24. 求一维数组平均数函数
  25.  */
  26. function calPerRow(arrRow,arrRowLen) { 
  27. var divisor=arrRowLen||arrRow.length;
  28.     var totalRow=0;  
  29.     for(var i=0;i<divisor;i++)  
  30.     {
  31.         totalRow+=arrRow[i];
  32.     }  
  33. for(var j=0;j<divisor;j++)  
  34.     {  
  35.       if(arrRow[j]==0)  
  36.         {  
  37.            divisor-=1;  
  38.         }  
  39.      }  
  40.   return totalRow/divisor;  
  41. }  
  42.   
  43. console.log(averagePerRow(grades))  
  44. console.log(calPerRow(grades1))

 

求二维数组每列平均数:

这个必须好好说一下,在实现的时候卡克了很久;关键点在于长度不一样的数组如何去求每列的和;

我的想法是把行列进行置换,然后再用求每行平均数的方法去求;

但是行列置换又是一个难点,关键还是在于每个数组的长度不一样(列数),我想的思路是求出二维数组中最大的那个数组的长度,然后让其他数组长度都为这个(不够的赋值0),然后进行行列置换;可以看成M*N的矩阵;

 

But!! 有一个大佬的思路是下面的,比我更简洁,而且代码量极少!~而且全部用ES6的语法写出来的,╮(╯▽╰)╭ 大牛就是大牛,然后仔细读了他的代码,当然借助了这个网站,在线将ES6转换为ES5;

/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&targets=&browsers=&builtIns=false&debug=false&code_lz=Q

 

下面就是大牛的代码,实现的功能是把数组进行行列置换;

 

  1. var arr = [
  2. [1, 2, 6,11,16],
  3. [3, 0, 4],
  4. [5, 6, 7,12],
  5. [8, 9, 10]
  6. ]
  7. var result = Array(Math.max(...arr.map(e =>e.length)))
  8. .fill("")
  9. .map((_e, outerIndex) => arr.map((e, innerIndex) => e[outerIndex])
  10. .filter(ele => ele !== undefined));
  11. //不知道大家看懂他的代码没,下面我就按照自己的理解解释一下;
  12. //思路:
  13. /*目标
  14. [1, 2, 6,11,16], [1,3,5,8]
  15. [3, 0, 4], [2,0,6,9]
  16. [5, 6, 7,12], ==> [6,4,7,10]
  17. [8, 9, 10] [11,12]
  18. [16]
  19. (1)生成需要输出的数组
  20. ["","","","",""]
  21. (2)生成M*N “矩阵”
  22. [1,3,5,8]
  23. [2,0,6,9]
  24. [2,0,6,9]
  25. [6,4,7,10]
  26. [11,undefined,12,undefined]
  27. [16,undefined,undefined,undefined]
  28. (3) 去除"undefined"
  29. [1,3,5,8]
  30. [2,0,6,9]
  31. [2,0,6,9]
  32. [6,4,7,10]
  33. [11,12]
  34. [16]
  35. (4)将最后结果填入刚生成的数组
  36. [
  37. [1,3,5,8],
  38. [2,0,6,9],
  39. [2,0,6,9],
  40. [6,4,7,10],
  41. [11,12],
  42. [16],
  43. ]
  44. */

 

 

 

 

 

 我自己又仿照他的思路用ES5的语法又实现了一遍,最终可以把每列的平均数求出来~

 

  1. var arr = [
  2. [1, 2, 6,11,16],
  3. [3, 0, 4],
  4. [5, 6, 7,12],
  5. [8, 9, 10]
  6. ]
  7. function getSum(total, num) {
  8. return total + Math.round(num);
  9. }
  10. function averageColRow(arr){
  11. var Max=0;
  12. arr.map(function(item){
  13. Max=Math.max(Max,item.length);
  14. })
  15. var result=Array(Max).fill("")
  16. .map(function(_e,outerIndex){
  17. return arr.map(function(e,innerIndex,input){
  18. return e[outerIndex]
  19. }).filter(function(ele){
  20. return ele!==undefined
  21. })
  22. });
  23. var permutationArray=result.map(function(item){
  24. {
  25. return item.filter(function(ele){
  26. return ele!=0;
  27. })
  28. }
  29. })
  30. return permutationArray.map(function(item){
  31. return item.reduce(getSum,0)/item.length;
  32. })
  33. }
  34. console.log(averageColRow(arr));