数组——蛇形矩阵、螺旋矩阵

来源:互联网 发布:海盗船水冷控制软件 编辑:程序博客网 时间:2024/05/29 04:00

 题目一:顺时针打印矩阵

取矩阵左上角的点(start,start)为起点,则判断一圈是否要打印的条件是start*2<rows && start*2<cols 。

import java.util.*;public class Solution {    public ArrayList<Integer> spiralOrder(int[][] matrix) {        ArrayList<Integer> array=new ArrayList();        if(matrix == null||matrix.length == 0||matrix[0].length == 0)            return array;        //print条件:*****start*2<rows,start*2<cols!        int rows=matrix.length;        int cols=matrix[0].length;        int start=0;        while(start*2<rows&&start*2<cols)            {            print(array,matrix,rows,cols,start);            start++;        }        return array;    }        public void print(ArrayList<Integer> array,int[][] matrix,int rows,int cols,int start)        {        //endX和endY简化计算。endX为需要打印的最尾端的行,endY为尾端的列;        int endX=rows-1-start;        int endY=cols-1-start;        //向右        for(int i=start;i<=endY;i++)            {            array.add(matrix[start][i]);        }        //向下;        if(endX-start>0)            {            for(int i=start+1;i<=endX;i++)                {                array.add(matrix[i][endY]);            }        }        //向左;        if(endY-start>0&&endX-start>0)//2个条件要考虑完全!            {            for(int i=endY-1;i>=start;i--)                {                array.add(matrix[endX][i]);            }        }        //向上;        if(endX-start>1&&endY-start>0)//2个条件要考虑完全!            {            for(int i=endX-1;i>start;i--)                {                array.add(matrix[i][start]);            }        }    }}

题目二:给一个正整数n,则打印出n*n阶矩阵。

例如:

Given n =3,

You should return the following matrix:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]]
注:若输出m*n阶矩阵,则最后要打印的数字为m*n,和n^2矩阵方法类似,只是一行或一列打印完后控制的是m--或者n--。
 public int[][] generateMatrix(int n) {        int x=0;//x为当前要打印的matrix的行        int y=0;//y为当前要打印的matrix的列        int c=1;//当前打印的元素;        int s=n*n;//最后要打印的数字;        int [][]matrix=new int[n][n];        while(c<=s)            {            //向右            for(int i=0;i<n;i++)                {                matrix[x][y++]=c++;            }            x++;            y--;            n--;            //向下            for(int i=0;i<n;i++)                {                matrix[x++][y]=c++;            }            x--;            y--;            //向左;            for(int i=0;i<n;i++)                {                matrix[x][y--]=c++;            }            x--;            y++;            n--;            //向上;            for(int i=0;i<n;i++)                {                matrix[x--][y]=c++;            }            x++;            y++;        }        return matrix;    }

题目描述

有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。

给定一个二位数组arr及题目中的参数n,请返回结果数组。

测试样例:
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]],4
返回:[4,3,8,2,7,12,1,6,11,16,5,10,15,9,14,13]

import java.util.*;public class Printer {    public int[] arrayPrint(int[][] matrix, int n) {        // write code here        if(matrix == null||n == 0){            return new int[]{};        }        int[]result=new int[n*n];        int index=0;        //右上半部分        for(int i=n-1;i>=0;i--){            int row=0;            int col=i;            while(col <= n-1){                result[index++]=matrix[row++][col++];            }        }        //左下部分        for(int i=1;i<n;i++){            int row=i;            int col=0;            while(row <= n-1){                result[index++]=matrix[row++][col++];            }        }        return result;    }}



0 0
原创粉丝点击