矩形数组水平翻转、垂直翻转、对角线翻转、逆时针旋转、顺时针旋转。
1、翻转
1.1、水平翻转
使二维数组进行水平翻转即使(n/2)行之前的元素和之后的元素交换,即行进行交换。
代码:
//此方法用于对二维数组进行水平翻转操作。
public int[][] change(int[][] matrix) {
int tem=0,row_max = matrix.length-1;//rows 用来保存二维数组的行数最大值
for(int i=0;i for(int j=0;j tem = matrix[row_max-i][j];//(row_max - i)为倒数i行对应的行。 matrix[row_max-i][j] = matrix[i][j]; matrix[i][j] = tem; } } return matrix; } 测试数据: int[][] matrix={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; 输出结果: 9 10 11 12 5 6 7 8 1 2 3 4 1.2、垂直翻转 垂直翻转和水平翻转思想相同不再赘述。 代码: public int[][] change(int[][] matrix){ int tem = 0,row_max = matrix[0].length-1; for(int i=0;i for(int j=0;j tem = matrix[i][row_max-j]; matrix[i][row_max-j] = matrix[i][j]; matrix[i][j] = tem; } } return matrix; } 测试数据: int[][] matrix={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 即: 1 2 3 4 5 6 7 8 9 10 11 12 输出结果: 4 3 2 1 8 7 6 5 12 11 10 9 1.3、主对角线翻转 此算法进行主对角线翻转时要求行和列的数量相同。 代码: public int[][] change(int[][] matrix){ int tem; for(int i=0;i for(int j=0;j
tem = matrix[j][i]; matrix[j][i] = matrix[i][j]; matrix[i][j] = tem; } } return matrix; } 测试数据: int[][] matrix2={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; 即: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 16 输出结果: 1 5 13 2 6 10 14 3 7 11 15 4 8 12 16 1.4、次对角线翻转 要求同上(行列数量相同)。 代码: public int[][] change(int[][] matrix){ int len = matrix.length,term=0; for(int i=0;i //(len-1)为矩形数组的最大下标值 //j+i for(int j=0,n=len-1-i;j // n=len-1-i => n+i=len-1 // j // n与i的和为矩形数组下标最大值,j与i的和不大于矩形数组下标的最大值 term=matrix[i][j]; matrix[i][j]=matrix[i+n][j+n]; matrix[i+n][j+n]=term; } } return matrix; } 测试数据: int[][] matrix2 = { {1,2,3}, {4,5,6}, {7,8,9}, }; 输入结果: 9 6 3 8 5 2 7 4 1 2、旋转 这里对矩形二维数组的各个元素进行顺时针旋转90度和逆时针旋转90度。其他旋转度数可以多次进行顺时针或逆时针旋转90度得到,这里不再演示。 2.1、顺时针旋转90度 把所有的数组元素顺时针旋转90度。 代码: public int[][] change(int[][] matrix){ // 在建立新数组时将行和列的数量进行交换 int[][] matrix2 = new int[matrix[0].length][matrix.length]; // n为控制新数组列的输入的一个变量 for(int i=0,n = matrix.length-1;i for(int j=0;j //当i=0,j=0时,matrix2[0][matrix.length-1]在第一行最后一个元素的位置 //当i=0,j=1时,matrix2[1][matrix.length-1]在第二行最后一个元素的位置 //...依次往后推即可发现规律--原数组列的递增就是新数组最后一列行的递增 matrix2[j][n] = matrix[i][j]; } } return matrix2; } 测试数据: int[][] matrix={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; 输出结果: 9 5 1 10 6 2 11 7 3 12 8 4 2.2、逆时针旋转90度 思想同上。 代码: public static int[][] change(int[][] matrix){ int[][] matrix2 = new int[matrix[0].length][matrix.length]; for(int i=0;i for(int j=0,n = matrix[0].length-1;j matrix2[n][i] = matrix[i][j]; } } return matrix2; } 测试数据: int[][] matrix={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; 输出结果: 4 8 12 3 7 11 2 6 10 1 5 9 3、总结 通过一系列的测试和演示我们可以发现,对矩形二维数组的翻转和旋转总是建立在二重循环的基础上,然后再对i、j进行一系列的操作,必要时要新增一个或多个变量来表示行或列。 进行对角线翻转时必须要求行和列相同,行列不同时无主次对角线,无法进行对角线翻转,而进行水平翻转、垂直翻转、顺时针旋转、逆时针旋转时则不要求行列相同。 操作矩形的各种翻转旋转关键时找寻规律,找到规律再写算法时就简单了。