js实现蛇形矩阵
参加腾讯前端实习生笔试,真的是被虐了千百遍,除了一条js程序题,其他半点前端都没有,都是考算法,计算机原理,数据结构。下面贴上腾讯笔试最后三大条中的一条,实现一个蛇形矩阵的输出。蛇形矩阵的什么样这里我就不多说了。
var lineCount=0; var numCount=1; var lineLog=1; var doubleArray=[]; var result="result:"; var lineCountGet; function index (n) { ArrayMake(n); lineCountGet=n; draw(lineCount); } function ArrayMake(log){ if(log>0){ --log; doubleArray[log]=new Array(); ArrayMake(log) } } function draw(lineNum){ if(lineNum>lineCountGet){ console.log(result); }else{ for(i=0;i<=lineNum;i++){ console.log(doubleArray); if(lineLog==1){ doubleArray[lineNum-i][i]=numCount; result+=doubleArray[lineNum-i][i]; }else{ doubleArray[i][lineNum-i]=numCount; result+=doubleArray[i][lineNum-i]; } ++numCount; } lineLog=-lineLog; ++lineCount; draw(lineCount); } } index(5);
整理下思路,首先看到蛇形矩阵,第一想法就是做成一个二维矩阵,然后通过遍历输出。这里博主没有输出,只是console了一下
首先看变量定义
var lineCount=0; var numCount=1;//当前排到的数字 var lineLog=1;//矩阵排列顺序有两种,这里将自左下至右上设为负 var doubleArray=[];//初始化一个数组 var result="result:"; var lineCountGet;//需要输出几列 function index (n) { ArrayMake(n); lineCountGet=n; draw(lineCount); }
因为数字插入是按照1,2,3,4.....这样的,所以初始化一下,之后通过自加实现递增。linelog的设定是因为我们每个斜行顺序有正向有反向
之后我们遇到第一个问题,js中不可以直接命名多维数组,所以我们只好自己造一个通过function ArrayMake
function ArrayMake(log){ if(log>0){ --log; doubleArray[log]=new Array(); ArrayMake(log) } }
用一步递归,对array中每个数组再次array化
数组造好了,下面我们要做的就是插数字了
function draw(lineNum){ if(lineNum>lineCountGet){ console.log(result); }else{ for(i=0;i<=lineNum;i++){ console.log(doubleArray); if(lineLog==1){ doubleArray[lineNum-i][i]=numCount; result+=doubleArray[lineNum-i][i]; }else{ doubleArray[i][lineNum-i]=numCount; result+=doubleArray[i][lineNum-i]; } ++numCount; } lineLog=-lineLog; ++lineCount; draw(lineCount); } }
linenum这边是用来告知当前是第几斜行,因为第几斜行就有几个数,这样便于for循环的书写,再通过linelog辨别斜行顺序的正反区分应该加入数组的样式。ok,搞定!