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;
}