LeetCode算法题--模拟

0006 Z字形变换

题目:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

技巧:用flag来标记下一步往哪里走;StringBuilder比String拼串效率高。

public String convert(String s, int numRows) {
     if (numRows==1){
         return s;
     }
     List<StringBuilder>list = new LinkedList<>();
     for (int i = 0; i < Math.min(numRows,s.length()) ; i++) {
         list.add(new StringBuilder());
     }
     boolean flag= false;
     int currRow=0;
     for (int i = 0; i < s.length() ; i++) {
         list.get(currRow).append(s.charAt(i));
         if (currRow==0||currRow==numRows-1){
             flag=!flag;
         }
         if (flag){
             currRow+=1;
         }else{
             currRow-=1;
         }
     }
     StringBuilder ans=new StringBuilder();
     for (int i = 0; i < list.size(); i++) {
         ans.append(list.get(i));
     }
     return ans.toString();
 }

0054 螺旋矩阵

题目:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

思路:运用数组来实现遍历方向(DFS经常用),用flag来标记这个点是否已经遍历过

public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer>list = new ArrayList<>();
    int R= matrix.length;
    int C=matrix[0].length;
    int dr[]={-1,0,1,0};
    int dc[]={0,-1,0,1};
    int r = 0, c = 0, di = 0;
    boolean flag[][]= new boolean[R][C];
    for (int i = 0; i < R*C ; i++) {
        list.add(matrix[r][c]);
        flag[r][c]=true;
        int mr = r + dr[di];
        int mc = c + dc[di];
        if (0 <= mr && mr < R && 0 <= mc && mc < C && !flag[mr][mc]){
            r = mr;
            c = mc;
        } else {
            di = (di + 1) % 4;
            r += dr[di];
            c += dc[di];
        }
    }
    return list;
}

0059 螺旋矩阵 II

题目:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

思路:与上一题类似

public int[][] generateMatrix(int n) {
    if (n==0){
        return null;
    }
    int dr[]={0,1,0,-1};
    int dc[]={1,0,-1,0};
    int di=0;
    int answer[][]= new int[n][n];
    int r=0;
    int c=0;
    for (int i = 0; i < n*n ; i++) {
        answer[r][c]=i+1;
        int mr = r + dr[di];
        int mc = c + dc[di];
        if (mr>=0&&mr<n&&mc>=0&&mc<n&&answer[mr][mc]==0){
            r=mr;
            c=mc;
        }else{
            di=(di+1)%4;
            r += dr[di];
            c += dc[di];
        }
    }
    return answer;
}
原创文章 14 获赞 10 访问量 581

猜你喜欢

转载自blog.csdn.net/qq_43672466/article/details/104962977