矩形数组水平翻转、垂直翻转、对角线翻转、逆时针旋转、顺时针旋转。
1、翻转
1.1、水平翻转
使二维数组进行水平翻转即使(n/2)行之前的元素和之后的元素交换,即行进行交换。
代码:
//此方法用于对二维数组进行水平翻转操作。
public int[][] change(int[][] matrix) {
int tem=0,row_max = matrix.length-1;//rows 用来保存二维数组的行数最大值
for(int i=0;i<matrix.length/2;i++) {
for(int j=0;j<matrix[0].length;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<matrix.length;i++) {
for(int j=0;j<matrix[0].length/2;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<matrix.length;i++) {
for(int j=0;j<i;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;i++) {
//(len-1)为矩形数组的最大下标值 //j+i<len-1为限定只交换数组对角线上方的元素
for(int j=0,n=len-1-i;j<len-1-i;j++,n--) {
// n=len-1-i => n+i=len-1
// j<len-1-i <=> j+i<len-1
// 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<matrix.length;i++,n--) {
for(int j=0;j<matrix[0].length;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<matrix.length;i++) {
for(int j=0,n = matrix[0].length-1;j<matrix[0].length;j++,n--) {
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进行一系列的操作,必要时要新增一个或多个变量来表示行或列。
进行对角线翻转时必须要求行和列相同,行列不同时无主次对角线,无法进行对角线翻转,而进行水平翻转、垂直翻转、顺时针旋转、逆时针旋转时则不要求行列相同。
操作矩形的各种翻转旋转关键时找寻规律,找到规律再写算法时就简单了。
网友评论