二维数组矩阵的题目

最近准备练一下二维数组矩阵的题目
二维数组需要注意的是a[i][j]是第i-1行的[j-1]位, 之前把他当成了之前的x,y坐标,也是醉了
一般遇到二维数组的题目, 把两边的顶点的坐标写出来(la,lb) (ra, rb)
然后分层就好, 不过如果是非长方形矩阵, 需要考虑单行,单列

转圈打印

    public static void main(String[] args) {
//        int [] [] a  = {{1,2,3,4}, {5,6,7,8}, {9, 10, 11,12}, {13,14,15,16}};
//        int [] [] a  = {{1,2,3,4}};
        int [] [] a  = {{1}, {5}, {9}, {13}};
        curPrint(a);
        System.out.println("============");
    }
    
    // 转圈打印
    // 这个二维矩阵和x,y的坐标还不一样 a[][]. 第一个坐标代表行, 第二个坐标是列
    public static void curPrint(int [][] nums) {
        int a = 0;
        int h = nums.length;
        int w = nums[0].length;
        // 起点(la, lb)  终点 (ra, rb)
        for (int la = a, lb = a, ra = h - 1, rb = w -1; la <=ra && lb <= rb; la++, lb++, ra--, rb--) {
            // 需要确定 四个坐标
            print(la, lb, ra, rb, nums);
        }
    }

    private static void print(int la, int lb, int ra, int rb, int[][] nums) {
        // 四个遍历
        for (int i = lb; i < rb; i++) {
            System.out.println(nums[la][i]);
        }
        for (int i = la; i < ra; i++) {
            System.out.println(nums[i][rb]);
        }
        for (int i = rb; i > lb ; i--) {
            if(ra == la )  {
                System.out.println(nums[ra][i]);
                break;
            }
                System.out.println(nums[ra][i]);
        }
        for (int i = ra; i > la ; i--) {
            if (lb == rb ){
                System.out.println(nums[i][rb]);
                break;
            }
            System.out.println(nums[i][lb]);
        }

    }

旋转90度, 还是分层, 然后获取两个坐标,在然后注意这边是正方形, 然后遇到这种题目,手动画图

    public static void rotate(int[][] matrix) {
        // 转角度90, 那么一定是正方形
        if (matrix == null ||  matrix.length ==1) {
            return;
        }
        int la = 0;
        int lb = matrix.length -1;
        while (la < lb ) {
            doWork(la, lb, matrix);
            la = la +1;
            lb = lb -1;
        }
    }

    private static void doWork(int la, int lb, int[][] matrix) {
        // 坐标是(la,la)  (lb, lb)
        for (int i = 0; i < lb - la; i++) {
            // 可以看成是第一行向右遍历过程中, 把所有对应的元素转一圈
            int tmp = matrix[la][la+i];
            // 先换左下角
            matrix[la][la+i] = matrix[lb - i][la];
            // 右下角
            matrix[lb-i][la] = matrix[lb][lb-i];
            // 右上角
            matrix[lb][lb-i] = matrix[la + i][lb];
            // 原始位置
            matrix[la + i][lb] = tmp;
        }
    }

你可能感兴趣的:(二维数组矩阵的题目)