顺时针打印矩形列表

问题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

方法1

public static ArrayList<Integer> printMatrix(int [][] matrix) {
int n = matrix[0].length;
int m = matrix.length;
if(m == 0 ) return null;
ArrayList<Integer> arr = new ArrayList<Integer>();

int circle = ((Math.min(n, m)-1)/2)+1;//层数
for(int i=0;i<circle;i++){
for(int j = i;j<n-i;j++){//从左往右
arr.add(matrix[i][j]);
}
for(int j=i+1;j<m-i;j++){//从上到下
arr.add(matrix[j][n-i-1]);
}
for(int j=n-i-1-1;j>=i&&(m-i-1!=i);j--){//从右到左
arr.add(matrix[m-i-1][j]);
}
for(int j=m-i-1-1;j>i&&(n-i-1!=i);j--){//从下到上
arr.add(matrix[j][i]);
}

}
return arr;

}

方法2:

public static ArrayList<Integer> printMatrix1(int [][] matrix) {
int n = matrix[0].length;
int m = matrix.length;
if(m == 0 ) return null;
ArrayList<Integer> arr = new ArrayList<Integer>();

int top = 0,left = 0,right = n-1,bottom =m-1;
while(top<=bottom && left<=right){
for(int i = left;i <=right;i++){//从左到右
arr.add(matrix[top][i]);
}
for(int i = top+1;i<=bottom;i++){//从上到下
arr.add(matrix[i][right]);
}
if(top!=bottom){
for(int i = right-1;i>=left;i--){//从右到左
arr.add(matrix[bottom][i]);
}
}
if(left!=right){
for(int i=bottom-1;i>top;i++){//从下到上
arr.add(matrix[i][left]);
}
}
top++;
left++;
right--;
bottom--;

}

return arr;

}

时间: 2024-09-30 00:56:03

顺时针打印矩形列表的相关文章

剑指offer:顺时针打印矩阵

题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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. 这种按照某个方向打印的,我们可以一圈一圈从外到内打印整个矩阵.在这个题目中,我们可以每次选择一个起点(左上角),然后顺时针打印一圈. class Solution: # matrix类型为二维列表,需要返回列表 def

《剑指offer》面试题20 顺时针打印矩阵 Java版

我的方法:遇到这种题最好在纸上画一画打印路线.我利用了4个标志left.top.right.bottom,表示当前需要打印的左界.上届.右界和下界,换句话说这些界线之外的已经打印了,如此一来判断结束的标准也很清晰,top>bottom或者left>right就表示已经没有需要打印的空间.和第14题中确定结束条件类似,明确下标的含义,就能很快判断结束条件. public void myPrint(int[][] a){ if(a == null || a.length == 0 || (a.le

剑指Offer(十九)——顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下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. 思想: 一圈一圈的打印,这道题难点在于何时中止打印. 图为在矩阵中某一圈,length为矩阵长度,width为矩阵宽度,坐标值为数组下标. 对于我们这道题来说,只

顺时针打印矩阵

P128顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 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 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>   #include<stdlib.h>   void printMatri

使用for循环打印矩形和三角形、菱形、空心菱形

打印矩形 **************************************************************************************************** public class Demo3_712 { public static void main(String args[]){ for(int i=1;i<=10;i++){ //控制行 for(int j=1;j<=10;j++){ //控制列 System.out.print(&

python练习题:循环打印嵌套列表

好久没写博文了,添加一个练习题,选自<head_first_python>~~ python列表:以中括号开始和结束"[]":列表项以逗号","分隔开,使用赋值操作符"="赋予一个标识符.如: movies=["the holy",1975,"terry jones",91,["graham",["michael","john",&qu

【 C++】顺时针打印矩阵

题目:输入一个矩阵,按照从外向里顺时针的顺序依次打印出每一个数字.例如: 如果输入一下矩阵: 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 对于这个题.首先考虑打印结束的条件,然后考虑如何顺时针打印一圈. void printMatrixClockwisely(int **numbers,int columns,int rows) {   

顺时针打印矩阵-剑指Offer

顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路 整体是按着一圈一圈打印,需要找到循环继续的条件:columns > startX * 2并且rows > startY * 2 注意打印每圈的时候,四个边的打印循环起始条件 代码 import java.

剑指OFFER之顺时针打印矩阵(九度OJ1391)

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列. 接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1&l