前端在线编程笔试记录——蛇形数字

来源:互联网 发布:主机屋数据库地址 编辑:程序博客网 时间:2024/05/29 16:16


题目大意:

有蛇形数组,规律如下:

1 2 3

8 9 4

7 6 5

亦如:

1    2    3    4  5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

就是说,转着圈写正方形数字,像蛇盘旋一样。

要求实现:依次打印出每排的数字。如前,需要打印 1 2 3 8 9 4 7 6 5.


我的思路:

我估计一般人还是会从用二维数组来考虑吧,比如说我。

比如输入3,,就应该对应一个3*3的二维数组:[[1,2,3],[8,9,4],[7,6,5]],这样的话一次打印就很好输出了。

关键是,如何知道二维数组的那一项对应哪个数字呢?arr[0][0]对应1,任意arr[i][j]对应哪一个呢?

我是按着它的这个蛇形规律去思考的。数字是逐步递增的,从1到n*n。先从左上角开始,然后向右赋值,再向下,再向左,再向上,完成一个轮回。里面的赋值一样也是这个顺序,我将每一圈赋值看作一个周期,如果传入4,我需要赋值2圈,如果传入5,我需要赋值3圈(虽然最后一圈仅仅赋值一个数字,也可当作一个轮回)。如图:



功能实现:

function main(n){//给每一个轮回去赋值,赋值到二维数组//定义二维数组var arr = [];for(var i=0;i<n;i++){arr[i] = [];}//定义值x,每次递增1var x=1;var r = Math.ceil(n/2);//需要循环的次数for(var d=0;d<r;d++){test(n-d);//给二维数组的每一个位置赋值}function test(m){//m为从边长递减至循环结束的值,如当n=5时,m可取值5,4,3for(var i=n-m,j=n-m;j<m;j++){ arr[i][j] = x++; }//上边赋值for(var i=n-m+1,j=m-1;i<m;i++){ arr[i][j] = x++; }//右边for(var i=m-1,j=m-2;j>=n-m;j--){ arr[i][j] = x++; }//下边for(var i=m-2,j=n-m;i>n-m;i--){ arr[i][j] = x++; }//左边}//打印最后结果for(var i=0;i<arr.length;i++){for(var j=0;j<arr[i].length;j++){//console.log(arr[i][j]);}console.log(arr[i]);//为了方便查看,直接打出每个数组}}




================================================================

许祥记于2016校园秋招




0 0