顺时针输出矩阵
2016-06-03 21:25
274 查看
对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例:
返回:[1,2,4,3]
思路:首先确定思路,按层由外往内,因此必须确定每一层的起始点和终止点坐标(x,y),按照从左至右,从右至下,从下至左,从左至起点import java.util.*;
public class Test {
public List<Integer> list = new ArrayList<Integer>();
public int[] clockwisePrint(int[][] mat, int n, int m) {
// write code here
if (mat == null) {
return null;
}
int startX = 0;
int startY = 0;
int endY = mat[0].length - 1;
int endX = mat.length - 1;
while ((startX <= endX) && (startY <= endY)) {
printCircle(mat, startX, startY, endX, endY);
startX++;
startY++;
endX--;
endY--;
}
int [] arr = new int[n*m];
for(int i=0;i<m*n;i++){
arr[i] = list.get(i);
}
return arr;
}
public void printCircle(int[][] matrix, int startX, int startY, int endX, int endY) {
// only one column left
if (startY == endY) {
for (int i = startX; i <= endX; i++ ) {
list.add(matrix[i][endY]);
}
return;
}
// only one row left
if (startX == endX) {
for (int i = startY; i <= endY; i++ ) {
list.add(matrix[startX][i]);
}
return;
}
for (int i = startY; i < endY; i++ ) {
list.add(matrix[startX][i]);
}
for (int i = startX; i < endX; i++ ) {
list.add(matrix[i][endY]);
}
for (int i = endY; i > startY; i-- ) {
list.add(matrix[endX][i]);
}
for (int i = endX; i > startX; i-- ) {
list.add(matrix[i][startY]);
}
}
public static void main(String[] args) {
Test test = new Test();
int [][]arr ={{57,50,59,18,31,13},{67,86,93,86,4,9},{38,98,83,56,82,90},{66,50,67,11,7,69},{20,58,55,24,66,10},{43,26,65,0,64,28},{62,86,38,19,37,98}};
int [] result = test.clockwisePrint(arr,7,6);
for(int i = 0;i < result.length;i++){
System.out.print(result[i]+",");
}
}
}牛客网测试通过(在牛客网尽量不要使用static修饰成员变量和方法,经常导致编译结果出错)
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
思路:首先确定思路,按层由外往内,因此必须确定每一层的起始点和终止点坐标(x,y),按照从左至右,从右至下,从下至左,从左至起点import java.util.*;
public class Test {
public List<Integer> list = new ArrayList<Integer>();
public int[] clockwisePrint(int[][] mat, int n, int m) {
// write code here
if (mat == null) {
return null;
}
int startX = 0;
int startY = 0;
int endY = mat[0].length - 1;
int endX = mat.length - 1;
while ((startX <= endX) && (startY <= endY)) {
printCircle(mat, startX, startY, endX, endY);
startX++;
startY++;
endX--;
endY--;
}
int [] arr = new int[n*m];
for(int i=0;i<m*n;i++){
arr[i] = list.get(i);
}
return arr;
}
public void printCircle(int[][] matrix, int startX, int startY, int endX, int endY) {
// only one column left
if (startY == endY) {
for (int i = startX; i <= endX; i++ ) {
list.add(matrix[i][endY]);
}
return;
}
// only one row left
if (startX == endX) {
for (int i = startY; i <= endY; i++ ) {
list.add(matrix[startX][i]);
}
return;
}
for (int i = startY; i < endY; i++ ) {
list.add(matrix[startX][i]);
}
for (int i = startX; i < endX; i++ ) {
list.add(matrix[i][endY]);
}
for (int i = endY; i > startY; i-- ) {
list.add(matrix[endX][i]);
}
for (int i = endX; i > startX; i-- ) {
list.add(matrix[i][startY]);
}
}
public static void main(String[] args) {
Test test = new Test();
int [][]arr ={{57,50,59,18,31,13},{67,86,93,86,4,9},{38,98,83,56,82,90},{66,50,67,11,7,69},{20,58,55,24,66,10},{43,26,65,0,64,28},{62,86,38,19,37,98}};
int [] result = test.clockwisePrint(arr,7,6);
for(int i = 0;i < result.length;i++){
System.out.print(result[i]+",");
}
}
}牛客网测试通过(在牛客网尽量不要使用static修饰成员变量和方法,经常导致编译结果出错)
相关文章推荐
- Step7链接s7-200方法
- Hadoop 2.0--HA功能中ZKFC对NN状态的控制
- EffectiveC++实现(1)
- Linux命令集
- 【Poj2601】Simple calculations 二分
- linux常用命令之文件系统
- linux常用命令之文件系统
- 第二期冲刺站立会议个人博客10(2016/6/03)
- 行为委托
- HDU-2004
- 在虚拟机vmware workstation10上安装centos7步骤(http://jingyan.baidu.com/article/eae0782787b4c01fec548535.html)
- mysql主从复制原理
- 基于spark实现的CRF模型的使用与源码分析
- 大地测量学高斯投影正反算
- Ios开发:改变线程优先级
- 实战 Walker 之注册界面
- 招商银行支付dll在64位windows系统下的注册使用问题
- HDU1026
- opencv异常之无响应无提示
- C#操作Word导致 “Microsoft.Office.Interop.Word.ApplicationClass”的 COM 组件错误的解决方法