栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Leetcode(数组和字符串)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode(数组和字符串)


文章目录
  • 二维数组
    • 48. 旋转图像
      • 总结
    • 面试题 01.08. 零矩阵
      • 总结
    • 498. 对角线遍历
  • 字符串
    • 14. 最长公共前缀
      • 总结


二维数组 48. 旋转图像

48. 旋转图像

将一个二维矩阵顺时针旋转90°

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
123					741
456   ---->  		852
789					963
class Solution {
    public void rotate(int[][] matrix) {
        int n=matrix.length;
        int[][] matrixs=new int[n][n];

        for(int i = 0; i < n; i ++){
            for(int j = 0; j < n; j ++){
                matrixs[i][j]=matrix[n-1-j][i];
            }
        }
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < n; j ++){
                matrix[i][j]=matrixs[i][j];
            }
        }
    }
}
总结
顺时针旋转90°matrixs[i][j]=matrix[n-1-j][i];
逆时针旋转90°matrixs[i][j]=matrix[j][n-1-i];

画图理解

面试题 01.08. 零矩阵

面试题 01.08. 零矩阵

二维矩阵如果某个元素为0,该行该列都改为0
输入:
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出:
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]
class Solution {
    public void setZeroes(int[][] matrix) {
        int n = matrix.length;
        int[] row = new int[n];
        int[] colum = new int[matrix[0].length];
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < matrix[0].length; j ++){
                if(matrix[i][j]==0){
                    row[i]=1;
                    colum[j]=1;
                }
            }
        }
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < matrix[0].length; j ++){
                if(row[i]==1||colum[j]==1){
                    matrix[i][j]=0;
                }
            }
        }
    }
}
总结
注意利用bool值来记录某些特别的规则
498. 对角线遍历

498. 对角线遍历
边界题感觉
先说思路
(第一次思路)

我首先想到模拟的特殊情况(也就是溢出的情况)紧接着分为两部分,这里图我是把特殊边界单独处理放在while外

但是该代码 只适用方阵(本来打算改进为一般矩阵,但是代码太臭了,还是放弃吧-.-···

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int n=mat.length;
        int m=mat[0].length;
        int[] ans = new int[m*n];
        ans[0]=mat[0][0];
        int row=0,colum=1,index=1;
        for(int i = 1; i < n; i ++){
            if(row==0){
                while(colum!=0){
                    ans[index]=mat[row][colum];
                    index++;
                    row++;
                    colum--;
                }
                ans[index]=mat[row][colum];
                index++;
                row++;
            }
            else if(colum==0){
                while(row!=0){
                    ans[index]=mat[row][colum];
                    index++;
                    row--;
                    colum++;
                }
                ans[index]=mat[row][colum];
                index++;
                colum++;
            }
            else if(row>=n||colum>=n){
                break;
            }
        }
        if(row>=n){
            row--;
            colum++;
        }
        if(colum>=n){
            row++;
            colum--;
        }
        for(int i = 1; i < m; i ++){
            if(row==(n-1)){
                while(colum!=(m-1)){
                    ans[index]=mat[row][colum];
                    row--;
                    index++;
                    colum++;
                }
                ans[index]=mat[row][colum];
                index++;
                row++;
            }
            else if(colum==(m-1)){
                while(row!=(n-1)){
                    ans[index]=mat[row][colum];
                    row++;
                    colum--;
                    index++;
                }
                ans[index]=mat[row][colum];
                index++;
                colum++;
            }
            if(row==(n-1)&&colum==(n-1)){
                ans[index]=mat[n-1][m-1];
                break;
            }
        }
        return ans;
    }
}

大佬题解
第二次思路:
先分向上和向下两种排序,用%2来达成不同while,第一次的思路是分两半从对角线开始分析

(这里我发现矩阵分长矩阵和宽矩阵,以为我的适合于长矩阵,因为我的判断条件第二部分为是否为最后一行或者最后一列,结果还是不对)

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        if(mat.length==0)return new int[0];
        int m=mat.length;
        int n=mat[0].length;
        int count=m+n-1;
        int[] answer=new int[m*n];
        int row=0;
        int colum=0;
        int index=0;
        for(int i = 0; i < count; i ++){
            if(i%2==0){
            while(row>=0&&colum
                answer[index]=mat[row][colum];
                index++;
                row--;
                colum++;
            }
            if(colum>=n){
                    row=row+2;
                    colum--;
                }
                else{
                    row++;
                }
            }
            else{
            while(row=0){
                answer[index]=mat[row][colum];
                index++;
                row++;
                colum--;
            }
                if(row>=m){
                    colum=colum+2;
                    row--;
                }
                else{
                    colum++;
                }
            }
        }
        return answer;
    }
}
字符串

1.如果你确实希望你的字符串是可变的,则可以使用 toCharArray 将其转换为字符数组。
2.如果你经常必须连接字符串,最好使用一些其他的数据结构,如 StringBuilder 。
3.当我们使用 == 时,它实际上会比较这两个对象是否是同一个对象。
4.字符串在java中创建就不可变。

14. 最长公共前缀

14. 最长公共前缀

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0){
            return "";
        }
        String ans=strs[0];
        for(int i = 1; i < strs.length; i ++){
            int j = 0;
            for(; j < ans.length()&&j < strs[i].length(); j++){
                if(ans.charAt(j)!=strs[i].charAt(j)){
                    break;
                }
            }
            ans=ans.substring(0,j);
            if(ans.equals("")){
                return ans;
            }
        }
        return ans;
    }
}
总结
substring:
    substring(0,a)--->含头不含尾
    substring(a)--->删除前a个字符
数组.length
string.length()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号