自己做的算法题目,分享自己的解题思路。
题目描述
给定一个整型矩阵matrix,请按照顺时针转圈的方式打印它。
如下示例1
输入
[[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]
代码实现:
import java.util.*;
public class Solution {
/**
*
* @param matrix int整型二维数组 the matrix
* @return int整型一维数组
*/
public int[] printMatrix (int[][] matrix) {
// write code here
int len1 = matrix.length;
int len2 = matrix[0].length;
int[] result = new int[len1*len2];
int status =1; //设定状态 1:向前 2:向下 3:向后 4:向上;初始状态是从左往右向前读取
int i=0,j=0;
int top=0,right=len2-1,bottle=len1-1,left=0;
int m=0;
while(m<result.length){
switch(status){
case 1:{
i=top;
for(j=left;j<=right;j++){
result[m] = matrix[i][j];
m++;
}
top++;
status = 2;
break;
}
case 2:{
j = right;
for(i=top;i<=bottle;i++){
result[m] = matrix[i][j];
m++;
}
right--;
status=3;
break;
}
case 3:{
i=bottle;
for(j=right;j>=left;j--){
result[m] = matrix[i][j];
m++;
}
bottle--;
status = 4;
break;
}
case 4:{
j=left;
for(i=bottle;i>=top;i--){
result[m] = matrix[i][j];
m++;
}
left++;
status = 1;
break;
}
default:break;
}
}
return result;
}
}
解题思路
转圈打印整形矩形数组,返回成一个一维数组,可以分析总共有四种都取矩形数组的方式:向前(右)读取、向下读取、向后(左)读取、向上读取;注意已经读取的点不能再次读取(要特别注意各个拐弯的节点).
再每一次读取完一行后要排除一行,读取完一列之后要排除一列。
所以如上述代码:
向前(右)读取完一行,行号(i)不变,列号(j)依序增加,读取完一行最后一个值后,将这上面一行排除(top++)并将状态(status)更改为向下读取;
向下读取完一列,行号(i)依序增加,列号(j)不变,读取完一列最后一个值后,将这右边一列排除(right--)并将状态(status)更改为向后(左)读取;
向后(左)读取完一行,行号(i)不变,列号(j)依序递减,读取完一行最后一个值后,将这最下面一行排除(bottle--)并将状态(status)更改为向上读取;
向上读取完一列,行号(i)依序递减,列号(j)不变,读取完一列最后一个值后,将这左边一列排除(left++)并将状态(status)更改为向前(右)读取;
循环执行上述操作,知道读取完全部值。
如上述例图: 操作行为为:向前----》向下----》向后----》向上---》向前----》向下----》向后;
第一次(向前):1,2,3,4
扫描二维码关注公众号,回复:
12888771 查看本文章

第二次(向下):1,2,3,4,8,12,16
第三次(向后):1,2,3,4,8,12,16,15,14,13
第四次(向上):1,2,3,4,8,12,16,15,14,13,9,5
第五次 (向前):1,2,3,4,8,12,16,15,14,13,9,5,6,7
第六次(向下):1,2,3,4,8,12,16,15,14,13,9,5,6,7,11
第七次(向后):1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10