1、转置矩阵
转置矩阵是最简单的了,无非就是矩阵的行和列互相变换一下,核心代码就一行,理解了就很简单。
public class 转置矩阵 {
/**
* 1 2 3 1 4 7
* 4 5 6 -> 2 5 8
* 7 8 9 3 6 9
* @param args
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//原矩阵
int[][] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
//行数
int n = a.length;
//列数
int m = a[0].length;
//转换后矩阵
int[][] arr = new int[n][m];
//转置
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = a[j][i];
}
}
//输出
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
2、旋转矩阵
旋转矩阵比转置要难一点,需要自己去找规律,我这里写的是矩阵逆时针旋转90度的代码,具体可见注释,
核心代码同样是一行,不过需要自己去分析发现。
public class 旋转矩阵 {
// 逆时针旋转90度
/**
*1 2 3 3 6 9
4 5 6 -> 2 5 8
7 8 9 1 4 7
*
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 原矩阵
int[][] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
//行数
int n = a.length;
//列数
int m = a[0].length;
// 转换后矩阵
int[][] arr = new int[n][m];
// 旋转
for (int i = 0; i < n; i++) {
for (int j = 0; j < m ; j++) {
arr[m - 1 - j][i] = a[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
3、顺时针打印矩阵
/**
* 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
* 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.
*/
顺时针打印矩阵比前两个要难得多,代码也复杂了很多,解决这个题有两个思路:
一、先打印矩阵的第一行,然后逆时针90度旋转矩阵,再打印矩阵的第一行,当然,注意输出是第一个元素的起始位置不要重复打印,然后以此类推,直到最后。(这种方法比较麻烦,所以,没有代码)
二、(借鉴的大神的思想,然后自己写出来的)给每个矩阵规定一个层数,如,四行四列的矩阵即为两层(外边一层12个元素,内层4个元素),三行三列的矩阵也是两层(外层8个元素,内层1个元素),具体代码实现可见代码区。有了层数之后问题就变成了每层的顺时针遍历,然后设一个循环一层一层进行遍历,就简单多了。
public class 顺时针打印矩阵 {
/**
* 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
* 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.
*/
public static void main(String[] args) {
int[][] a = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
System.out.println(printMatrix(a));
}
public static ArrayList printMatrix(int[][] array) {
ArrayList list = new ArrayList<>();
int n = array.length;
int m = array[0].length;
/**
* 核心
*/
int c = (Math.min(n, m) - 1) / 2 + 1;// 层数
for (int i = 0; i < c; i++) {
for (int j = i; j < m - i; j++)// 左上到右上
list.add(array[i][j]);
for (int k = i + 1; k < n - i; k++)// 右上到右下
list.add(array[k][m - i - 1]);
for (int o = m - i - 1; o > i; o--)// 右下到左下
list.add(array[n - i - 1][o - 1]);
for (int p = n - i - 2; p > i; p--)// 左下到右上
list.add(array[p][i]);
}
return list;
}
}
总结:都是些很简单的小案例,然后我整合到一块发了出来,可以留待日后观看。