1.序

记得在腾讯面试以及字节面试的时候有这么一道题----旋转矩阵。当时听到这个有点害怕,因为搜索过自己刷过的题没有这个,但是现在离大厂就差一道题,怎么办,逼着自己想。最后克服压力做出来了。后来把所有有关矩阵的整理了一遍,对之后的笔试面试都有很大的帮助,希望可以帮助大家梦想成真。

2.顺时针旋转90度

这道题腾讯面试题。<mark>重要的是空间复杂度为O(1)</mark>

public class Test24 {
   
    /* * 给定一个N*N的整形矩阵Matrix,把这个矩阵顺时针旋转90度,输入(打印)元素值。 * 例如: * 1 2 3 4 * 5 6 7 8 * 9 10 11 12 * 13 14 15 16 * 输出结果为: * 13 9 5 1 * 14 10 6 2 * 15 11 7 3 * 16 12 8 4 * * 要求:额外空间复杂度为O(1) * */
    public static void main(String[] args) {
   
//初始化一个 4*4的整形矩阵,从第一行第一列从左向右,第二行,第三行,直到第四行依次赋值 1,2,...16.
        int[][] matrixDemo=new int[4][4];
        matrixDemo=createMatrix();
        printMatrix(matrixDemo);
        System.out.println();
        //顺时针旋转90度打印
        rotate(matrixDemo);
        printMatrix(matrixDemo);
    }
    //顺时针旋转90度打印
    private static void rotate(int[][] matrix) {
   
        // TODO Auto-generated method stub
        int topRow=0;
        int topCol=0;
        int dowmRow = matrix.length-1;
        int dowmCol = matrix[0].length-1;
        while(topRow <= dowmRow) {
   
            rotateEdge(matrix, topRow++, topCol++, dowmRow--,dowmCol--);
        }
    }
    //顺时针旋转90度打印
    private static void rotateEdge(int[][] matrix, int topRow, int topCol, int dowmRow, int dowmCol) {
   
        // TODO Auto-generated method stub
        int times=dowmRow-topRow;
        // timies就是总的组数
        int temp=0;
        for(int i=0; i!=times;i++) {
   
            //一次循环就是一组调整
            temp=matrix[topRow][topCol+i];
            //赋值给临时变量 1 2
            matrix[topRow][topCol+i]=matrix[dowmRow-i][topCol];
            //7 --> 1 4 --> 2
            matrix[dowmRow-i][topCol]=matrix[dowmRow][dowmCol-i];
            //9 --> 7 8 --> 4 
            matrix[dowmRow][dowmCol-i]=matrix[topRow+i][dowmCol];
            //3 --> 9 6 --> 8
            matrix[topRow+i][dowmCol]=temp;
            //1 --> 3 2 --> 6
        }
    }
    //生成矩阵
    private static int[][] createMatrix() {
   
        // TODO Auto-generated method stub
        int matrix[][]=new int[4][4];
        int k=1;
        for(int i=0;i<4;i++) {
   
            for(int j=0;j<4;j++) {
   
                matrix[i][j]=k;
                k++;
            }
        }
        return matrix;
    }
    //顺序打印矩阵元素
    private static void printMatrix(int[][] matrix) {
   
        for(int i=0;i<4;i++) {
   
            for(int j=0;j<4;j++) {
   
                System.out.print(matrix[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

3.顺时针、逆时针、翻转

public class Test8 {
   
    public static void main(String[] args) {
   
        System.out.println("原");
        printMatrix(createMatrix());
        System.out.println("顺");
        printMatrix(change(createMatrix()));
        System.out.println("逆");
        printMatrix(helper(createMatrix()));
        System.out.println("翻转");
        printMatrix(fanzhuan(createMatrix()));
    }
    //生成矩阵
    private static int[][] createMatrix() {
   
        // TODO Auto-generated method stub
        int matrix[][]=new int[4][4];
        int k=1;
        for(int i=0;i<4;i++) {
   
            for(int j=0;j<4;j++) {
   
                matrix[i][j]=k;
                k++;
            }
        }
        return matrix;
    }
    //顺序打印矩阵元素
    private static void printMatrix(int[][] matrix) {
   
        for(int i=0;i<4;i++) {
   
            for(int j=0;j<4;j++) {
   
                System.out.print(matrix[i][j]+"\t");
            }
            System.out.println();
        }
    }

    //顺时针
    public static int[][] change(int [][]matrix){
   
        int [][]temp=new int[matrix[0].length][matrix.length];
        int dst=matrix.length-1;
        for(int i=0;i<matrix.length;i++,dst--){
   
            for(int j=0;j<matrix[0].length;j++){
   
                temp[j][dst]=matrix[i][j];
            }
        }
        return temp;
    }

    //逆时针
    public static int[][] helper(int[][] m_TestData){
   
        int iX, iY;
        int tmpData;
        int m_iHeight = m_TestData.length;
        int m_iWidth = m_TestData[0].length;

        for(iY=0; iY<m_iHeight; ++iY){
   
            iX= iY;
            for(; iX<m_iWidth; ++iX){
   
                tmpData = m_TestData[iY][iX];
                m_TestData[iY][iX] = m_TestData[iX][iY];
                m_TestData[iX][iY] = tmpData;
            }
        }

        for(iY=0; iY<m_iHeight/2; ++iY){
   
            for(iX=0; iX<m_iWidth; ++iX){
   
                tmpData = m_TestData[iY][iX];
                m_TestData[iY][iX] = m_TestData[m_iHeight-iY-1][iX];
                m_TestData[m_iHeight-iY-1][iX] = tmpData;
            }
        }
        return m_TestData;
    }
    public static int[][] fanzhuan(int[][] m_TestData) {
   
        int iX, iY;
        int tmpData;
        int m_iHeight = m_TestData.length;
        int m_iWidth = m_TestData[0].length;
        for (iY = 0; iY < m_iHeight / 2; ++iY) {
   
            for (iX = 0; iX < m_iWidth; ++iX) {
   
                tmpData = m_TestData[iY][iX];
                m_TestData[iY][iX] = m_TestData[m_iHeight - iY - 1][iX];
                m_TestData[m_iHeight - iY - 1][iX] = tmpData;
            }
        }
        return m_TestData;
    }
}

4.转置矩阵

给定一个矩阵 A, 返回 A 的转置矩阵。
矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。
示例 1:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]
示例 2:
输入:[[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

public class Test9 {
   
    public static void main(String[] args) {
   
        printMatrix(createMatrix());
        printMatrix(transpose(createMatrix()));
    }
    //生成矩阵
    private static int[][] createMatrix() {
   
        // TODO Auto-generated method stub
        int matrix[][]=new int[4][4];
        int k=1;
        for(int i=0;i<4;i++) {
   
            for(int j=0;j<4;j++) {
   
                matrix[i][j]=k;
                k++;
            }
        }
        return matrix;
    }
    //顺序打印矩阵元素
    private static void printMatrix(int[][] matrix) {
   
        for(int i=0;i<4;i++) {
   
            for(int j=0;j<4;j++) {
   
                System.out.print(matrix[i][j]+"\t");
            }
            System.out.println();
        }
    }
    public static int[][] transpose(int[][] A) {
   
        int row=A.length;
        int column=A[0].length;

        //新建一个矩阵B,表示矩阵A的转置
        int [][] B=new int[column][row];
        for(int i=0;i<column;i++)
        {
   
            for(int j=0;j<row;j++)
            {
   
                B[i][j]=A[j][i];
            }
        }
        return B;
    }

}
 

5.总结

在笔试面试中大家遇到问题首先不要慌,相信自己肯定可以做出来,然后的话在草稿本上进行演算,实在不行可以求面试官给点提示,最后如果对实现代码有困难或者没有时间的话把思路将给面试官听,总之一句话让面试官看到你的潜力与可能性。加油!!!

6.个人推广

博客地址
https://blog.csdn.net/weixin_41563161
掘金https://juejin.cn/user/2814360172369271

知乎https://www.zhihu.com/people/hai-kuo-tian-kong-63-38-21