学习计划(数组和字符串)

简介: 1

二维数组

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<n){
                answer[index]=mat[row][colum];
                index++;
                row--;
                colum++;
            }
            if(colum>=n){
                    row=row+2;
                    colum--;
                }
                else{
                    row++;
                }
            }
            else{
            while(row<m&&colum>=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()
目录
相关文章
|
5月前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
字符串转数组、数组转字符串、给第一个单词色值
字符串转数组、数组转字符串、给第一个单词色值
|
JavaScript 前端开发 Java
数组转字符串( 字符串转数组~
数组转字符串可以使用不同的方法,具体取决于编程语言和上下文环境。以下是一些通用的示例:
数组、字符串、集合的相互转换
数组、字符串、集合的相互转换
63 0
常用的数组(字符串)方法有哪些?(二)
concat:合并数组或者字符串,concat在项目中用的还是比较多的,最经典的就是一个表格数据是有两个或者三个数组组成的时候会用到,watch监听数组和concat结合使用。下期做一个例子。
|
JavaScript
常用的数组(字符串)方法有哪些?(一)
1.pop:末位删除,即删除数组的最后一项,返回值是被删除项。 2.shift:首位删除,即删除数组的第一项,返回值是被删除项。 3.splice:指定下标删除元素,返回被删除的元素。第一个参数是从下标几开始删除,第二个参数是删除几个,第三个参数是要插入的元素。splice方法是会改变原数组的。删除功能用的比较多,我个人更喜欢用filter来变相实现删除,splice是会改变原数组的,而filter不会
常用的数组(字符串)方法有哪些?(三)
some:判断数组中有没有符合条件的元素,一个符合的都没有返回false,有一个就是true。
逆序字符串 和 字符串的逆序输出 的区别~
逆序字符串 和 字符串的逆序输出 的区别~
109 0
写一个函数,可以逆序一个字符串的内容
写一个函数,可以逆序一个字符串的内容
98 0
|
自然语言处理 开发者 索引
字符串的下标和切片|学习笔记
快速学习字符串的下标和切片