牛客堂刷题(常见面试题精讲)之矩阵打印

来源:互联网 发布:手机编曲软件中文版 编辑:程序博客网 时间:2024/06/05 16:42

题目:

  实现转圈打印矩阵
  
   1   2    3  4
  10 11 12  5
   9   8    7   6


输出是1 2 3 4 5 6 7 8 9 10 11 12

思路:

  每次只需要打印一圈即可,然后左上角坐标都加1,右下角都减一,当两个的坐标错过去了就停止

代码:

public class CircleMatrix { public static void main(String[] args) {// int [][] num = {// {1,2,3,4},// {10,11,12,5},// {9,8,7,6}// };  Scanner sc = new Scanner(System.in); int row=0,col=0; //输入矩阵的行和列row = sc.nextInt();col = sc.nextInt();  int [][] num = new int[row][col]; for(int i=0;i<row;i++) for(int j=0;j<col;j++) num[i][j]=(int)(Math.random()*100);   for(int i=0;i<num.length;i++){ for(int j=0;j<num[0].length;j++) System.out.print(num[i][j]+"  "); System.out.println();}    System.out.println("输出后:"); printCircleMatrix(num);  }private static void printCircleMatrix(int[][] num) {   int startx = 0,starty=0; int endx = num.length-1,endy=num[0].length-1;  while(endx>=startx||endy>=starty) { if(startx==endx)//只有一行时 { for(int k=starty;k<=endy;k++) System.out.print(num[startx][k]+" "); }else if(starty==endy)//只有一列时 { for(int k=startx;k<=endx;k++) System.out.print(num[k][starty]+" "); }else { int i,j; for(i=startx;i<endy;i++) System.out.print(num[startx][i]+" ");   for(j=starty;j<endx;j++) System.out.print(num[j][endy]+" ");  for(;i>starty;i--) System.out.print(num[endx][i]+" "); for(;j>startx;j--) System.out.print(num[j][starty]+" ");  if((endx==startx)&&(endy==starty)) System.out.print(num[startx][starty]+"?");   } startx++;starty++; endx--;endy--; } }}


进阶题目:

之字形打印,即蛇形输出

输入矩阵实例:
1   2   3   4
5   6   7   8
9 10 11 12 

输出:
2 5 
9 6 3
4 7 10
11 8 
12

思路:

定义两个下标,i,j指向左上角第一个,两个坐标确定一条斜线,从 i 到 j , 然后i右移,j下移,确定2~~5这一条斜线,以此类推,然后便是确定方向即可,
 设置个布尔变量,一次上一次下,i走到尽头往下走,j走到尽头往右走,即可。
下列代码是输入行列数,然后产生一个随机矩阵,对其进行蛇形输出。

代码:

public class PrintThisMatrix {public static void main(String[] args) {////int [][] num = {//{1,2,3,4},//{5,6,7,8},//};Scanner sc = new Scanner(System.in);int row=0,col=0; System.out.println("请输入行列数:");while(sc.hasNext()){row = sc.nextInt(); col = sc.nextInt();  if(row>0&&col>0)break; else{ System.out.println("输入错误,请重新输入"); }} int [][] num = new int[row][col];for(int i=0;i<row;i++)for(int j=0;j<col;j++)num[i][j] = (int)(Math.random()*100);System.out.println("原数组:");for(int i=0;i<row;i++){for(int j=0;j<col;j++)System.out.print(num[i][j]+"  ");System.out.println();}printMatrix(num);sc.close();} private static void printMatrix(int[][] num) {boolean flag =true;int index=0;int cnt=0;int length = num[0].length+num.length-1;Point right = new Point(0,0);Point left = new Point(0,0);boolean tagRight=false,tagLeft=false;while(cnt<length){if(!flag)//从上往下{//i(0,2)==>j(2,0) 横坐标加1,纵坐标减1Point tempi = new Point(left);tempi.translate(1, -1);Point tempj = new Point(right);while(!tempj.equals(tempi)){System.out.print(num[tempj.x][tempj.y]+" ");tempj.translate(1,-1);}System.out.println();}else//从下往上{//j(1,0)==>i(0,1) 横坐标减1,纵坐标加1Point tempj = new Point(right);tempj.translate(-1, 1);Point tempi = new Point(left);//依次从下往上遍历while(!tempi.equals(tempj)){System.out.print(num[tempi.x][tempi.y]+" ");tempi.translate(-1, 1);}System.out.println();}//right走到最右边,然后要往下走if(right.equals(new Point(0,num[0].length-1)))tagRight=true;//left走到最下边,然后往右走if(left.equals(new Point(num.length-1,0)))tagLeft=true;if(!tagRight){right.translate(0, 1);}else{right.translate(1, 0);}if(!tagLeft){left.translate(1, 0);}else{left.translate(0, 1);}cnt++;//调整方向,一次上一次下if(index%2==0){flag=true;}else{flag=false;}index++;} }}


0 0
原创粉丝点击