顺时针打印矩阵—剑指offer

题目:输入一个矩阵,按照从里向外的顺序依次打印出每一个数字。

代码:

  1 #include <cstdio>
  2
  3 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
  4 void printNumber(int number);
  5
  6 void PrintMatrixClockwisely(int** numbers, int columns, int rows)
  7 {
  8     if (numbers == nullptr || columns <= 0 || rows <= 0)
  9         return;
 10
 11     int start = 0;
 12
 13     while (columns > start * 2 && rows > start * 2)
 14     {
 15         PrintMatrixInCircle(numbers, columns, rows, start);
 16
 17         ++start;
 18     }
 19 }
 20
 21 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
 22 {
 23     int endX = columns - 1 - start;
 24     int endY = rows - 1 - start;
 25
 26     // 从左到右打印一行
 27     for (int i = start; i <= endX; ++i)
 28     {
 29         int number = numbers[start][i];
 30         printNumber(number);
 31     }
 32
 33     // 从上到下打印一列
 34     if (start < endY)
 35     {
 36         for (int i = start + 1; i <= endY; ++i)
 37         {
 38             int number = numbers[i][endX];
 39             printNumber(number);
 40         }
 41     }
 42
 43     // 从右到左打印一行
 44     if (start < endX && start < endY)
 45     {
 46         for (int i = endX - 1; i >= start; --i)
 47         {
 48             int number = numbers[endY][i];
 49             printNumber(number);
 50         }
 51     }
 52
 53     // 从下到上打印一行
 54     if (start < endX && start < endY - 1)
 55     {
 56         for (int i = endY - 1; i >= start + 1; --i)
 57         {
 58             int number = numbers[i][start];
 59             printNumber(number);
 60         }
 61     }
 62 }
 63
 64 void printNumber(int number)
 65 {
 66     printf("%d\t", number);
 67 }
 68
 69 // ====================测试代码====================
 70 void Test(int columns, int rows)
 71 {
 72     printf("Test Begin: %d columns, %d rows.\n", columns, rows);
 73
 74     if (columns < 1 || rows < 1)
 75         return;
 76
 77     int** numbers = new int*[rows];
 78     for (int i = 0; i < rows; ++i)
 79     {
 80         numbers[i] = new int[columns];
 81         for (int j = 0; j < columns; ++j)
 82         {
 83             numbers[i][j] = i * columns + j + 1;
 84         }
 85     }
 86
 87     PrintMatrixClockwisely(numbers, columns, rows);
 88     printf("\n");
 89
 90     for (int i = 0; i < rows; ++i)
 91         delete[](int*)numbers[i];
 92
 93     delete[] numbers;
 94 }
 95
 96 int main(int argc, char* argv[])
 97 {
 98     /*
 99     1
100     */
101     Test(1, 1);
102
103     /*
104     1    2
105     3    4
106     */
107     Test(2, 2);
108
109     /*
110     1    2    3    4
111     5    6    7    8
112     9    10   11   12
113     13   14   15   16
114     */
115     Test(4, 4);
116
117     /*
118     1    2    3    4    5
119     6    7    8    9    10
120     11   12   13   14   15
121     16   17   18   19   20
122     21   22   23   24   25
123     */
124     Test(5, 5);
125
126     /*
127     1
128     2
129     3
130     4
131     5
132     */
133     Test(1, 5);
134
135     /*
136     1    2
137     3    4
138     5    6
139     7    8
140     9    10
141     */
142     Test(2, 5);
143
144     /*
145     1    2    3
146     4    5    6
147     7    8    9
148     10   11   12
149     13   14   15
150     */
151     Test(3, 5);
152
153     /*
154     1    2    3    4
155     5    6    7    8
156     9    10   11   12
157     13   14   15   16
158     17   18   19   20
159     */
160     Test(4, 5);
161
162     /*
163     1    2    3    4    5
164     */
165     Test(5, 1);
166
167     /*
168     1    2    3    4    5
169     6    7    8    9    10
170     */
171     Test(5, 2);
172
173     /*
174     1    2    3    4    5
175     6    7    8    9    10
176     11   12   13   14    15
177     */
178     Test(5, 3);
179
180     /*
181     1    2    3    4    5
182     6    7    8    9    10
183     11   12   13   14   15
184     16   17   18   19   20
185     */
186     Test(5, 4);
187
188     return 0;
189 }

时间: 2024-12-24 18:33:01

顺时针打印矩阵—剑指offer的相关文章

顺时针打印矩阵-剑指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

从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 数据结构:队列 将树按层遍历,先将根节点的左右子节点先后进入队列,然后再先后从队列取出,然后将取出的节点的左右子节点再入队列 循环进行,直到队列为空 代码 import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** public class TreeNode { int val = 0; Tree

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

从尾到头打印链表-剑指Offer

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值 输入描述 输入为链表的表头 输出描述 输出为需要打印的“新链表”的表头 思路 单向链表是从头到尾指向的,从尾到头打印符合“后进先出”,所以我们使用栈结构Stack 代码 import java.util.ArrayList; import java.util.Stack; public class Solution03 { public ArrayList<Integer> printListFromTailToHead(

从上往下打印二叉树(剑指offer)+队列的应用

从上往下打印二叉树 参与人数:1577时间限制:1秒空间限制:32768K 通过比例:25.53% 最佳记录:0 ms|0K(来自  dust347) 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题意:就是树的层次遍历.想象一下,从根结点依次往下,每行从左到右,这不就是是入队和出队的操作嘛! so...代码很容易吧. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tr

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

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

【剑指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. 输入: 输入可能包含多个测试样例,对于每个测试案例,