旋转魔方

今天在看顺时针遍历数组的时候学到了新思路–旋转数组。
首先旋转数组的意思可以看下例:

123
456
789

逆时针旋转90°后:

369
258
147

即列变为行,行变为列。

public int[] revert(int[] matrix){
	int rows=matrix.length;//行值
	int cols=matrix[0].length;//列值
	int[][] newMatrix=new int[cols][rows];//行列交换
	for(int j=cols-1;i>=0;j++){
		for(int i=0;i<rows;i++)
			newMatrix[cols-1-j][i]=matrix[i][j];//第一行最后一个值赋给新数组的第一行第一个值
	}
	return newMatrix;
}

进一步,题目中要求的是顺时针遍历数组,例子:

123
456
789

输出:

123698745

结合旋转魔方的思想,我们可以这样:
1.访问第一行元素1 2 3,删除这一行
2.剩下的进行逆时针旋转,得到:

69
58
47

3.访问第一行元素6 9,删除这一行,
4.剩下的进行旋转:

87
54

5.同理,重复1,2步,访问8 7,删除这一行,旋转

4
5

6.访问4,删除,旋转

5

7.结束

代码
我们要完成顺时针遍历的话,要把上面的旋转魔方方法稍微调整一下,因为我们需要删除一行再进行旋转:

public int[] revert2(int[] matrix){
	int rows=matrix.length;//行值
	int cols=matrix[0].length;//列值
	int[][] newMatrix=new int[cols][rows-1];//行列交换(删除一行,故列数减一)
	for(int j=cols-1;i>=0;j++){
		for(int i=1;i<rows;i++)//从第二行开始赋值
			newMatrix[cols-1-j][i]=matrix[i][j];
	}
	return newMatrix;
}

接下来写主方法:

public static ArrayList<Integer> printMatrix(int [][] matrix) {
	ArrayList<Integer> list=new ArrayList<Integer>();
	int rows=matrix.length;
	while(rows!=0){
		for(int i=0;i<matrix[0].length;i++)
			list.add(matrix[0][i];
		if(rows==1) break;//最后一行访问结束,无需再删除、旋转
		matrix=revert2(matrix);
		rows=matrix.length;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值