输入 :一个二维数组,例如:
[ [1,2,3] , [4,5,6] , [7,8,9] ]
输出 :二维数组的转置
[ [1,4,7] , [2,5,8] , [3,6,9] ]
矩阵的转置就是行列互换
function arrayT(sArray){
var tArray = []
//对目标数组初始化
for(var i = 0i <sArray[0].lengthi++){
tArray[i] = []
}
//转置数组
for(var i = 0i <sArray.lengthi++){
for(var j = 0j <sArray[i].lengthj++){
tArray[j][i] = sArray[i][j]
}
}
return tArray
}
注:
这是一道本人经历的面试题,题目要求是给一个字符串,"abc def ghi",输出为"adg beh cfi"。
通过这个面试题,我想到了数组的转置操作。
该题是在数组转置的基础上,我想到了之前leetcode上的一道题目,就重温一下。
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
输入:
[
[ 1 , 2 , 3 ] ,
[ 4 , 5 , 6 ] ,
[ 7 , 8 , 9 ]
]
输出:
[ 1 , 2 , 3 , 6 , 9 , 8 , 7 , 4 , 5]
其实是相当于每次遍历完外圈,然后遍历内圈;
我们可以把遍历每一圈作为一个完整的事件,然后不断去重复遍历每一圈就可以解决这个问题。
其实就是递归的运用。
arr =>{
// map函数用来完成当前矩阵最外一圈的遍历
// 二维数组 arr 表示当前矩阵
// 一维数组 result 用来保存遍历结果
let map = (arr, result) =>{
// 矩阵的高度即行数
let n = arr.length
// 遍历矩阵的每一行
for(let i = 0i <ni++){
// 若第一行 按顺序插入
if(i === 0){
result = result.concat(arr[i])
} else if (i === n-1){
// 若最后一行 倒序插入
result = result.concat(arr[i].reverse())
} else {
// 若中间行 插入该行最后一个元素 并将该元素从矩阵中删除
result.push(arr[i].pop())
}
}
// 将已经遍历的第一行和最后一行从矩阵中删除
arr.pop()
arr.shift()
// 遍历插入最左侧一列 此时删除首位两行后矩阵高度已变为n-2
for(let j = n - 3j >= 0j--){
// 避免arr[j]长度为空时插入undefined
if(arr[j].length){
result.push(arr[j].shift())
}
}
// 截止条件 矩阵有元素就继续递归
if(arr.length){
// 把已将遍历元素删除的矩阵进行递归
return map(arr, result)
}else{
return result
}
}
// 将初始矩阵传入, 保存结果的数组初始为空
return map(arr, [])
}
题目:
给定一个 n × n的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在[原地]旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
刚开始我大概看了下,就是把矩阵中第n列反序后作为n行,那这就很简单了,我是这么写的:
最后返回的矩阵排序是正确的,不过最后去校验的时候发现是在原来的矩阵里调整,那也简单,我把久的矩阵的值改成和新矩阵相同就可以了:
我这种解法只是发现了这个规律,如果不让用新矩阵作为桥梁,不知还会有那些解法