今天翻笔记,看到了曾经面试爱奇艺的一道算法面试题,当时由于时间的关系并没有答出来,回家也没有认真思考过,今天看到了,索性就沉下心来写了一下,可能方法过去繁琐,如果有更好的答案,可以一起探讨哦!下面就和我一起来看一下这道面试题吧~~
题目:
将数组
[
[1,4,7],
[2,5,6],
[3,8,9]
];
变成
[
[1,2,3],
[4,5,8],
[7,6,9]
];
思路:
本道题乍一看有点蒙,是个二维数组,细看可以理解为我们上学时都学过的n * m矩阵,题的本意就是想把n * m矩阵变成m*n矩阵。
步骤:
1.首先先将二维数组转化为一维数组,结果如下:
【
1,4,7,
2,5,6,
3,8,9
】;
2.然后很明显,我们要将上面的一维数组改成下面新数组的样子:
【
1,2,3,
4,5,8,
7,6,9
】;
要想拿到上面的数组,我们思考一下,一共有N行,M列。
拿到数组的下标我们就可以获取到新的数组。要拿到的index为
0,3,6
1,4,7
2,5,8
从上面可以看出规律吧。。。直接上公式吧:
第一组:0+3X0 0+3X1 0+3X2
第二组:1+3X0 1+3X1 1+3X2
第三组:2+3X0 2+3X1 2+3X2
。。。。
第N组:(n-1)+n*(m-1);
由此可以看出用两个循环嵌套就可以咯。
3.最后再用方法将一维数组变成二维数组即可。
废话不多说,直接上代码吧:
//n*m => m*n
let arr = [
[1,4,7],
[2,5,6],
[3,8,9],
];
//flat方法
function flaten(arr){
let newArr = [];
for(let i = 0;i<arr.length;i++){
if(Array.isArray(arr[i])){
newArr = newArr.concat(flaten(arr[i]));
}else{
newArr.push(arr[i]);
}
}
return newArr;
}
//变成想要的数组 0+3*1 0+3*2 0+3*3
//1+3*1 1+3*2 1+3*3
//2+3*1 2+3*2 2+3*3
//...... n循环 套m循环 公式: (n-1)+n*(m-1)
function getNewArr(arr){
let A =[];
let n = arr[0].length;
let m = arr.length;
for(let i=0;i<n;i++){
for(let j=0;j<m;j++){
let b = i+n*j;
A.push(flaten(arr)[b]);
}
}
return A;
}
//一维数组变多维数组
function getFan(arr){
let res = [];
let n = arr[0].length;
let m = arr.length;
for (let i = 0; i < n; i++) {
let temp = getNewArr(arr).splice(i*m, m);
res.push(temp);
}
return res;
}
console.log(getFan(arr));
//[
// [1,2,3],
// [4,5,8],
// [7,6,9],
// ]