数据结构和算法--二维数组

拜拜、爱过 提交于 2019-12-08 15:15:11

数据结构和算法中最基础的就是数组了,关于数组的定义、存取、遍历等一些基础操作就不讲了,相信大家都已熟练掌握,我这里就不再赘述了。今天讲一讲二维数组。

二维数组简单讲就是:数组元素是数组的数组(莫名拗口),但其实也不难理解。看个例子就完全明白了:
var grades = [[10, 20, 30], [40, 50,60], [70, 80, 90]] 

数组grades的每一个元素都是数组。相当于构建了一个3x3的数据表格:

10 20 30
40 50 60
70 80 90
遍历二维数组

遍历二维数组有两种方式:按行遍历,按列遍历。

先来看按行遍历

以上面定义的grades为例,我们来求取每行的平均值。很容易想到我们需要做一个嵌套循环,外层循环对应行,内层循环对应列。然后把每行的值相加再求平均值。

function traverseRows(arr) {
  var rows = arr.length
  for (var i = 0; i < rows; i++) {
    var inlen = arr[i].length,
      total = 0
    for (var j = 0; j < inlen; j++) {
      total += arr[i][j]
    }
    console.log('第' + i + '行平均数:' + total / inlen)
  }
}
traverseRows(grades)
按列遍历

对于按列遍历,我们只需要对循环稍加调整,外层循环对应列,内层循环对应行即可。我们暂且假设每行的子数组的长度相同。

function traverseCols(arr){
    var cols = arr[0].length,
        rows = arr.length
    for(var i = 0; i < cols; i++){
        var total = 0
        for(var j = 0; j < rows; j++){
            total += arr[j][i]
        }
        console.log('第' + i + '列平均数:' + total / rows)
    }
}
traverseCols(grades)

这样就按列遍历计算出每列的平均值。可对于参差不齐的二维数组以上方法并不适用。我们稍加改进,首先获取所有二级数组的最大长度,对于那些长度不够的数组在计算中用0替代。首先定义一个方法获取二级数组的最大长度

function maxLen(arr) {
  var max = 0
  for (var i = 0; i < arr.length; i++) {
    max = arr[i].length > max ? arr[i].length : max
  }
  return max
}

然后按照上面的思路稍加改动遍历过程

function traverseCols(arr) {
  var max = maxLen(arr),
    rows = arr.length
  for (var i = 0; i < max; i++) { // 遍历最大列
    var total = 0
    for (var j = 0; j < rows; j++) {
      total += arr[j][i] ? arr[j][i] : 0 // 空白位置置为0
    }
    console.log('第' + i + '列平均数:' + (total / rows).toFixed(2))
  }
}

这样无论对于整齐的二维数组还是参差不齐的二维数组都能很好的处理。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!