參加騰訊前端實習生筆試,真的是被虐了千百遍,除了一條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,搞定!