顺时针打印数组

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

【思路】这道题目需要我们学会如何设置变量,让程序更加好写一些,当我们通过设置上、下、左、右四个变量,可以很轻松的完成矩阵最外圈的打印,然后依次从外围向内打印!共需要四个打印过程!需要注意的是,当一个矩阵为列向量或者行向量又或者循环达到一个列向量或者行向量时,需要通过条件语句对后两个打印过程进行剔除,否则会造成重复打印,比如矩阵[1,2,3,4]打印成[1,2,3,4,3,2,1]

 1class Solution {
 2public:
 3    vector<int> printMatrix(vector<vector<int> > matrix) {
 4        int rows = matrix.size();
 5        int cols = matrix[0].size();
 6        vector<int> res;
 7
 8        // 输入的二维数组非法,返回空的数组
 9        if (rows == 0 || cols == 0)  return res;
10
11        // 定义四个关键变量,表示左上和右下的打印范围
12        int left = 0, top = 0, right = cols - 1, bottom = rows - 1;
13        while (left <= right && top <= bottom)
14        {
15            // 从左向右打印
16            for (int i = left; i <= right; ++i)
17                res.push_back(matrix[top][i]);
18            // 从上到下打印
19            for (int i = top + 1; i <= bottom; ++i)
20                res.push_back(matrix[i][right]);
21            // 从右向左打印
22            if (top != bottom)  // 为了避免矩阵是个行向量,重复打印
23            for (int i = right - 1; i >= left; --i)
24                res.push_back(matrix[bottom][i]);
25            // 从下到上打印
26            if (left != right)  // 为了避免矩阵是个列向量,重复打印
27            for (int i = bottom - 1; i > top; --i)
28                res.push_back(matrix[i][left]);
29            left++,top++,right--,bottom--;
30        }
31        return res;
32    }
33};

原文地址:https://www.cnblogs.com/zhudingtop/p/11332852.html

时间: 2024-10-15 14:50:35

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

剑指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

面试题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 第一行打印,从左往右: 第二行打印,从上往下: 第三行

算法:顺时针打印数组

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 > sta

剑指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),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过: 每一种打印模

【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(十九)——顺时针打印矩阵

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

【 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) {