day10-1572/566/1768

77 阅读1分钟

第一题

题目

给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。

请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和

image.png

思路

正方形的二维数组,只需要遍历一遍,左上->右下的对角线取[i, i]的值就好,右上->左下的对角线取[i, length - 1 - i],需要注意的是,奇数长度的二维数组,会算重合一个点(相交点,所以去掉这一点)

代码

    public int diagonalSum(int[][] mat) {
        int sum = 0;
        for(int i = 0; i < mat.length; i++) {
            int j = mat.length -1 - i;
            sum+=mat[i][i];
            if(i == j) {
                continue;
            }else {
                sum+=mat[i][j];
            };
        };
        return sum;
    }

第二题

题目

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵

思路

暴力破解,遍历填值

代码

 public int[][] matrixReshape(int[][] mat, int r, int c) {
        int rcLength = r*c;
        int m = mat.length;
        int n = mat[0].length;
        int matLength = m*n;
        if(rcLength != matLength || (m== r && n == c)) {
            return mat;
        }
            int[][] resArr = new int[r][c];
            int i = 0;
            int j = 0;
            int g = 0;
            int k = 0;
            while(i<m && j<n && g<r && k<c) {
                resArr[g][k] = mat[i][j];
                if(j == n -1) {
                    i++;
                    j=0;
                }else {
                    j++;
                };
                if(k == c-1) {
                    g++;
                    k=0;
                }else {
                    k++;
                };
            };
            return resArr;
    }

第三题

题目

给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串

思路

就按位插入啊,要是非要说可能是什么算法的话,应该是双指针吧

代码

    public String mergeAlternately(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        if(n == 0) return word1;
        StringBuilder sbuilder = new StringBuilder(word1);
        int i = m-1;
        int j = n-1;
        if(j > i) {
            sbuilder.insert(i + 1, word2.substring(i, n));
            j = i -1;
            i = i -1;
        }
        while(i > j) {
            i--;
        }
        while(i >= 0 && j >= 0) {
            sbuilder.insert(i +1, word2.charAt(j));
            i--;
            j--;
        };
        return sbuilder.toString();
    }