题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
普通思路:
找出打印的圈数,行数为rows,列数为columns,那么圈数就是矩阵短的对角线的一半,那么从左上到右上→从右上到右下→从右下到左下→从左下到左上,这样的过程为一圈
Java
package nowcoder;
import java.util.ArrayList;
public class S19_PrintMatrix {
public ArrayList<Integer> printMatrix(int[][] matrix){
ArrayList<Integer> result = new ArrayList<Integer>();
int rows = matrix.length; //矩阵行数
if (rows == 0)
return result;
int columns = matrix[0].length; //矩阵列数
if (columns==0)
return result;
int cycles = ((rows < columns?rows:columns)-1)/2 +1; //圈数
for (int i=0;i<cycles;i++){
for (int k=i;k<columns-i;k++) //左到右
result.add(matrix[i][k]);
for (int j=i+1;j<rows-i;j++) //上到下;
result.add(matrix[j][columns-1-i]);
for (int k=rows-2-i;k>=i;k--) //右到左
result.add(matrix[rows-1-i][k]);
for (int j=rows-2-i;j>i;j--) //下到上
result.add(matrix[j][i]);
}
return result;
}
public static void main(String[] args){
S19_PrintMatrix s19 = new S19_PrintMatrix();
int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
ArrayList<Integer> result = s19.printMatrix(matrix);
System.out.println(result);
}
}
特别思路:
可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作 例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。
Python
class PrintMatrix:
def printMatrix(self, matrix):
result = []
while matrix:
result += matrix.pop(0)
if not matrix:
break
matrix = self.turn(matrix)
return result
def turn(self, matrix):
#魔方旋转
col = len(matrix[0]) #列数
newMat = []
for i in range(col, 0, -1):
newMat.append([x[i-1] for x in matrix])
return newMat
if __name__ == '__main__':
test = PrintMatrix()
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
print(test.printMatrix(matrix))
结果:
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]