标签:blog http ar sp java for on 数据 2014
研究生的生活好无聊,最近想出去找找实习了。就复习一下数据结构,大一学的,也没复习过,面试的时候被鄙视了。 看到一个学姐发的,应该是金山的笔试题目:
给一个矩阵,将矩阵逆时针打印出来,如:
1 | 12 | 11 | 10 |
2 | 13 | 16 | 9 |
3 | 14 | 15 | 8 |
4 | 5 | 6 | 7 |
乍一看,这题目很简单,就是两个循环就可以搞定。其实,没有想的那么简单,因为每次循环后,循环体都发生了变化。参考了网上的一些解题思路,现在说一下我的思路。
1.定义一个方向d=(d+1)%4,那么d=0,1,2,3表示四个方向
2.打印矩阵当前的行col:k->j,列为row:m->n,初始条件:col=0,row=0,k=0,j=3,m=0,n=3
3,当打印第一列后,k+=1,col=n
4,当打印最后一行后,n-=1,row=j
5,打印最后一列,j-=1,col=m
6,打印第一行,m+=1,row=k
...
7.终止条件:m==n&&k==j
下面贴出我用java写的代码:
int [][]p={{1,12,11,10,},{2,13,16,9},{3,14,15,8},{4,5,6,7}}; int col=0,row=0;//当前的列和行 int m=0,n=3,k=0,j=3;//col:m->n row:k->j int d=-1;//表示方向 while(true) { d=(d+1)%4; switch (d) { case 0: for(int i=m;i<=n;i++ ) { System.out.print(p[i][row]+" "); } col=n; k+=1;//防止重复 break; case 1: for(int i=k;i<=j;i++) { System.out.print(p[col][i]+" "); } row=j; n-=1;//防止重复 break; case 2: for(int i=n;i>=m;i--) { System.out.print(p[i][row]+" "); } col=m; j-=1; break; case 3: for(int i=j;i>=k;i--) { System.out.print(p[col][i]+" "); } row=k; m+=1; break; default: break; } if(m==n&&k==j) { break; } }
标签:blog http ar sp java for on 数据 2014
原文地址:http://blog.csdn.net/yilip/article/details/41544895