JS实现顺时针打印数组

来源:互联网 发布:php aes解密后有乱码 编辑:程序博客网 时间:2024/05/21 12:47

今天中午吃饭的时候,遇到了一位同学,平时关系还算不错,最近他在准备面试,有一道面试题提了出来,就是关于5*5矩阵顺时针打印的问题。他是学习C语言和c++语言的,而我主要学习JavaScript。但是这有什么关系。这道题主要考察的是算法和判断边界问题。不论什么语言都可以实现的。每一门语言都有其独特的解决问题的场景,比如我学的JavaScript,在浏览器这块没有其他语言比它更加合适了。学习语言到最后,基本上核心就是算法和数据结构。新的问题产生,如何用简单高效的方法用语言解决,这是需要不断学习的。

过程

在吃饭的时候想了想。第一个想法就是用数组表示矩阵,然后遍历数组,重新组成一个新的字符串,就得到我们想要的结果了。这个思路很简单,就是不断遍历,将外围的一圈遍历完后,继续里面的一圈。而且需要判断边界问题。这也是自己在最后才明白这道面试题的考察点。吃饭结束后,回来在电脑上试了试,最开始就卡在二维数组的问题上,JavaScript中是动态数组,与之前学习的C语言数组还是有点区别的。于是取巧,再函数内声明一个数组,不需要再次输入。原本面试题还需要输入数组,然后再得出结果的。这个就不是重点了,重要的是如何将数组顺时针打印出来。
反正就是慢慢试,将一个3*3数组慢慢打印出来,用了四个for循环。没有考虑边界检查,也没有函数的概念,结果是出来了,虽然是3*3数组,但是距离5*5还远吗?
确实,需要承认的是,还有好远的额!我那个代码我都不想再看了,实在有点糟糕。没有边界检查,很容易出现错误,而且如果变成4*4或者其他的,就又要写一堆的废代码。接下来认真想了想,于是将处理过程放在一个函数中,并用递归的思想将其实现。程序立马不一样了,提高了可用性。

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <title>顺时针打印数组</title></head><body>    <script type="text/javascript">        window.onload = function() {        var columns=4,rows=4,start=0;//行 列 起始位置        var array=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]];//定义二维数组        var result=new Array();        printArray(array,columns,rows,start);        document.write(result.split(","))        function printArray(array,columns,rows,start){            if(columns < 1 || rows < 1 || start < 0 )                 return;              if( columns <= 2*start || rows <= 2*start )                 return;              var stopX = columns - 1 - start;//一圈最右列在坐标中的位置              var stopY = rows - 1 - start;//一圈最大行在坐标中位置              //打印此圈中的最上行              for(var i=start; i<=stopX; i++)                result+=array[start][i]+",";              //打印此圈中的最右列              if(start < stopX) //如果此圈中不止有一列              for(var i=start+1; i<=stopY; i++)               result+=array[i][stopX]+",";               //打印次圈中的最下行              if(start < stopX && start < stopY)              for(var i=stopX-1; i >= start; i--)                result+=array[stopY][i]+",";            //打印次圈中的最左行              if(start < stopX && start < stopY - 1)              for(var i=stopY-1; i >= start+1; i--)               result+=array[i][start]+",";             printArray(array,columns,rows,start+1);//下一圈循环               }    }    </script></body></html>

结果

测试结果没有问题,当然这个问题还有不用递归的解法,暂时就写在这里,欢迎各位大神指点代码不足之处,共同进步。

0 0
原创粉丝点击