算法:顺时针打印数组

import java.util.*;

public class Solution{
    ArrayList<Integer> list = new ArrayList<>();

    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int rows = matrix.length;
        int columns = matrix[0].length;
        int start = 0;
        while(rows > start*2 && columns > start*2){
            printMatrixInCircle(matrix, rows, columns, start);
            start++;
        }
        return list;
    }

    /**
     * 功能:打印一圈
     */
    public void printMatrixInCircle(int [][] matrix, int rows, int columns, int start){
        // 从左到右打印一行
        for(int i = start; i < columns - start; i++)
            list.add(matrix[start][i]);
        // 从上到下打印一列
        for(int j = start + 1; j < rows - start; j++)
            list.add(matrix[j][columns - start - 1]);
        // 从右到左打印一行
        // rows-start-1 表示从右往左打印的时候,要保证start的下边,确实还有需要打印的行才行,也就保证
        // matrix[rows - start - 1][m]的行坐标合法
        //否则[[1,2,3,4,5]]会错误打印成[1,2,3,4,5,4,3,2,1]
        //这里的m需要减2的原因是,上一层从上到下已经把本轮循环占掉一个位置
        for(int m = columns - start - 2; m >= start && rows - start -1 > start; m--)
            list.add(matrix[rows - start - 1][m]);
        // 从下到上打印一列
        for(int n = rows - start - 2; n >= start + 1 && columns - start - 1 > start; n--)
            list.add(matrix[n][start]);
    }
}

原文地址:https://www.cnblogs.com/theWinter/p/10797624.html

时间: 2024-11-04 00:04:08

算法:顺时针打印数组的相关文章

剑指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. 分析:书上的变量有点多,看不大懂,这里借助了一个辅助数组,用来判定已经访问过的节点. package com.gjjun.jzoffer;import java.util.ArrayList; import java.ut

顺时针打印数组

[问题]输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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. [思路]这道题目需要我们学会如何设置变量,让程序更加好写一些,当我们通过设置上.下.左.右四个变量,可以很轻松的完成矩阵最外圈的打印,然后依次从外围向内打印!共需要四个打印过程!需要注意的是,当一个矩阵为列向量或者行向量又

面试题20顺时针打印数组

/*题目描述,要注意边界问题 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 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. 思路: 开始坐标(start,start),循环继续的条件是rows>2*startX,column>2*startY 第一行打印,从左往右: 第二行打印,从上往下: 第三行

经典算法——顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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 { public: vector<int> printMatrix(vector<vector<int> > matrix) { vector<int> res

剑指Offer-顺时针打印数组

题目描述:输入一个数组(m*n维),要求从外向里顺时针打印数组的元素. #include <iostream> #include <stdio.h> using namespace std; void PrintMatrixInCircle(int **numbers,int rows,int columns,int start); void printNumber(int number); void PrintMatrixCircle(int **numbers,int rows

笔试算法题(26):顺时针打印矩阵 &amp; 求数组中数对差的最大值

出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左,下上),所以需要一个index变量控制每次循环时执行的打印模式: 注意水平打印和垂直打印分别需要两个变量控制打印元素,并且两组变量中的两个端点都是相互靠近的(hs和he,vs和he),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过: 每一种打印模

顺时针打印矩阵(经典算法)

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. #该函数像魔方一样翻转矩阵,每次都把要打印的一列翻转到第一行def turnMatrix(matrix): r = len(matrix) c = len(matrix[0]) B = [] for i in range(c-1,-1,-

【ACM】顺时针打印矩阵

问题描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 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. 算法描述: 以(x,y)元组作为当前打印元素的指针,当前位置加上-1,0,1分别 表示x,y坐标后退.保持不变和前进.如矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 若当前位置为(0,0

【剑指offer】顺时针打印矩阵

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上测试通过. 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 输入: 输入可能包含多个测试样例,对于每个测试案例,