顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.
就像这样把他打印出来
一开始还好,到4然后转向,但是会发现,转完一圈之后,是从6开始的!
而且一圈不一定四个方向都有,比如3X3的一个第二圈相当于只有中间那个!
所以我们的思路是,把每一圈的规则写上,然后修改每一圈的起点
比如上图第一圈是1为起点,第二圈是6为起点
而6的位置是1的位置横纵列相加的位置
方法
用while循环保证每一圈的起点合法
内部用四个for循环(后两个还要记得判定是否是最后一行或者最后一列),用列表进行增加,最后去重
源代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int r=matrix.length;
int c=matrix[0].length;
if(r==0||c==0)return null;
//int [][]m;=new int[r][c]
//左上节点的个数,以一圈为一个轮回,然后将每个轮回读入的数放到一个列表中,然后将原来的置为0;
ArrayList<Integer>m=new ArrayList<Integer>();
//start这个作为起始点
int start=0;
//这里没有等于
while(start<r&&start<c){
for(int j=start;j<c;j++){
m.add(matrix[start][j]);
}
for(int i=start;i<r;i++){
m.add(matrix[i][c-1]);
}
if(start!=r-1){
for(int j=c-1;j>=start;j--){
m.add(matrix[r-1][j]);
}
}
//这里要做判定,因为最后一行或一列在上面就读过了,这里重复了
if(start!=c-1){
for(int i=r-1;i>=start;i--){
m.add(matrix[i][start]);
}
}
start++;
r--;
c--;
}
for(int i=0;i<m.size();i++){
for(int j=i+1;j<m.size();j++){
if(m.get(i)==m.get(j)){
m.remove(j);
}
}
}
return m;
}
}