链接:
https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a
来源:牛客网
来源:牛客网
- 热度指数:180588 时间限制:1秒 空间限制:32768K
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
分析:每次按顺时针,从右-->下-->左-->上的方向获得矩阵最外层对应位置的元素。tR,tC表示当前矩阵左上角元素的位置,dR,dC表示当前矩阵右下角的元素。当tR=dR表示当前矩阵只有一行;tC=dC表示当前元素只有一列。循环获得当前矩阵最外层对应位置的元素,并加入ArrayList列表中,直至while(tR <= dR && tC <= dC)为假时结束,此时ArrayList列表res中存放的数据就是按就是矩阵按顺时针存放的结果。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int tR = 0;
int tC = 0;
int dR = matrix.length - 1;
int dC = matrix[0].length - 1;
ArrayList<Integer> res = new ArrayList<>();
while(tR <= dR && tC <= dC){
if(tR == dR){
for(int i = tC;i <= dC;i++)
res.add(matrix[tR][i]);
}else if(tC == dC){
for(int i = tR;i <= dR;i++)
res.add(matrix[i][tC]);
}else{
int i = tR , j = tC;
while(j != dC){
res.add(matrix[tR][j]);
j++;
}
while(i != dR){
res.add(matrix[i][dC]);
i++;
}
while(j != tC){
res.add(matrix[dR][j]);
j--;
}
while(i != tR){
res.add(matrix[i][tC]);
i--;
}
}
tR++;
tC++;
dR--;
dC--;
}
return res;
}
}
分析二:参考讨论中
低调的奶牛的思路:模拟魔方逆时针旋转的方法,一直做取出第一行的操作存入ArrayList列表中后删除第一行的元素,删除第一行后,再进行一次逆时针旋转,重复该操作直至结束即可。