最近准备练一下二维数组矩阵的题目
二维数组需要注意的是a[i][j]是第i-1行的[j-1]位, 之前把他当成了之前的x,y坐标,也是醉了
一般遇到二维数组的题目, 把两边的顶点的坐标写出来(la,lb) (ra, rb)
然后分层就好, 不过如果是非长方形矩阵, 需要考虑单行,单列
转圈打印
public static void main(String[] args) {
// int [] [] a = {{1,2,3,4}, {5,6,7,8}, {9, 10, 11,12}, {13,14,15,16}};
// int [] [] a = {{1,2,3,4}};
int [] [] a = {{1}, {5}, {9}, {13}};
curPrint(a);
System.out.println("============");
}
// 转圈打印
// 这个二维矩阵和x,y的坐标还不一样 a[][]. 第一个坐标代表行, 第二个坐标是列
public static void curPrint(int [][] nums) {
int a = 0;
int h = nums.length;
int w = nums[0].length;
// 起点(la, lb) 终点 (ra, rb)
for (int la = a, lb = a, ra = h - 1, rb = w -1; la <=ra && lb <= rb; la++, lb++, ra--, rb--) {
// 需要确定 四个坐标
print(la, lb, ra, rb, nums);
}
}
private static void print(int la, int lb, int ra, int rb, int[][] nums) {
// 四个遍历
for (int i = lb; i < rb; i++) {
System.out.println(nums[la][i]);
}
for (int i = la; i < ra; i++) {
System.out.println(nums[i][rb]);
}
for (int i = rb; i > lb ; i--) {
if(ra == la ) {
System.out.println(nums[ra][i]);
break;
}
System.out.println(nums[ra][i]);
}
for (int i = ra; i > la ; i--) {
if (lb == rb ){
System.out.println(nums[i][rb]);
break;
}
System.out.println(nums[i][lb]);
}
}
旋转90度, 还是分层, 然后获取两个坐标,在然后注意这边是正方形, 然后遇到这种题目,手动画图
public static void rotate(int[][] matrix) {
// 转角度90, 那么一定是正方形
if (matrix == null || matrix.length ==1) {
return;
}
int la = 0;
int lb = matrix.length -1;
while (la < lb ) {
doWork(la, lb, matrix);
la = la +1;
lb = lb -1;
}
}
private static void doWork(int la, int lb, int[][] matrix) {
// 坐标是(la,la) (lb, lb)
for (int i = 0; i < lb - la; i++) {
// 可以看成是第一行向右遍历过程中, 把所有对应的元素转一圈
int tmp = matrix[la][la+i];
// 先换左下角
matrix[la][la+i] = matrix[lb - i][la];
// 右下角
matrix[lb-i][la] = matrix[lb][lb-i];
// 右上角
matrix[lb][lb-i] = matrix[la + i][lb];
// 原始位置
matrix[la + i][lb] = tmp;
}
}