最近很长时间都没有更新文章了,这是因为最近在find work,所以大多数时间都是在复习,刷题响应的就会变少了。
来看一下今天的问题,给你提供矩阵的长和宽,构建一个蛇形矩阵。
蛇形矩阵
如下:
输入:
3*3
输出:
1 6 7 2 5 8 3 4 9
这个其实还算简单,我们每次只需要循环一列即可。
代码如下:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String[] strs = s.split("/*");
// 因为输入的是自然数,且小于整形最大值
int rowNum = Integer.parseInt(strs[0]);
int colNum = Integer.parseInt(strs[2]);
// 构建
buildSnackMatrix(rowNum, colNum);
}
/**
* 构建蛇形矩阵
* @param rowNum 行数
* @param colNum 列数
* @return snackMatrix 二维矩阵
*/
private static int[][] buildSnackMatrix(int rowNum, int colNum) {
int[][] snackMatrix = new int[rowNum][colNum];
int index = 1;
for (int i = 0; i < colNum; i++) {
if (i % 2 == 0) {
for (int j = 0; j < rowNum; j++) {
snackMatrix[j][i] = index++;
}
} else {
for (int j = rowNum - 1; j >= 0; j--) {
snackMatrix[j][i] = index++;
}
}
}
for (int[] ints : snackMatrix) {
StringBuilder sb = new StringBuilder(colNum * 2);
for (int anInt : ints) {
sb.append(anInt).append(",");
}
// 去除最后一个 ,
System.out.println(sb.substring(0, sb.length() - 1));
}
return snackMatrix;
}
螺旋输出矩阵
先来一个简单的练练手,给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
输入:
[[1,2,3],[4,5,6],[7,8,9]]
输出:
[1,2,3,6,9,8,7,4,5]
这道题说难不是很难,说简单但是却很绕。
思路其实很简单,我们记录下矩阵的长和宽,记为top(0),bottom(m-1),left(0),right(n-1)。
然后我们在将第一行放入数组后,可以想象成将矩阵的顶给剪掉了,所以top + 1。
然后将最后一列放入数组,可以想象成将矩阵的右侧给剪掉了,所以right - 1。
然后将最后一行放入数组,可以想象将矩阵最下面给剪掉,所以bottom - 1。
然后将最左侧放入数组,同理left + 1。
所以代码如下,
public ArrayList<Integer> spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return new ArrayList<>();
}
int height = matrix.length;
int length = matrix[0].length;
return getCircleMatrix(matrix,length,height);
}
public ArrayList<Integer> getCircleMatrix(int[][] matrix,int length,int height) {
int top = 0;
int left = 0;
int bottom = height - 1;
int right = length - 1;
// 最外层开始
ArrayList<Integer> rt = new ArrayList<>(length * height);
int index = 0;
while(top <= bottom && left <= right) {
for(int i = left; i <= right; i++) {
rt.add(matrix[top][i]);
}
top++;
for(int i = top; i <= bottom; i++) {
rt.add(matrix[i][right]);
}
right--;
if(top <= bottom && left <= right) {
for(int i = right; i >= left; i--) {
rt.add(matrix[bottom][i]);
}
bottom--;
for(int i = bottom; i >= top; i--) {
rt.add(matrix[i][left]);
}
left++;
}
}
return rt;
}
螺旋构建矩阵
螺旋构建矩阵其实本质上和螺旋输出矩阵是一样的。
如果你理解了上面输出螺旋矩阵的话,这个对你来说不是问题的,这个比构建蛇形矩阵就难了一点点。
直接上代码
/**
* 构建螺旋矩阵
* @param rowNum 行数
* @param colNum 列数
* @return spiralMatrix 二维数组
*/
private static int[][] buildSpiralMatrix(int rowNum, int colNum) {
int[][] spiralMatrix = new int[rowNum][colNum];
// 从1开始累加
int index = 1;
// 左上到右下
int top = 0;
int bottom = rowNum - 1;
int left = 0;
int right = colNum - 1;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) {
spiralMatrix[top][i] = index++;
}
top++;
for (int i = top; i <= bottom; i++) {
spiralMatrix[i][right] = index++;
}
right--;
if(top <= bottom && left <= right) {
for (int i = right; i >= left; i--) {
spiralMatrix[bottom][i] = index++;
}
bottom--;
for (int i = bottom; i >= top; i--) {
spiralMatrix[i][left] = index++;
}
left++;
}
}
for (int[] ints : spiralMatrix) {
StringBuilder sb = new StringBuilder(colNum * 2);
for (int anInt : ints) {
sb.append(anInt).append(",");
}
System.out.println(sb.substring(0, sb.length() - 1));
}
return spiralMatrix;
}