题目:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,

例如,如果输入如下矩阵: 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、循环起始条件和结束条件:

起始条件:(1,1),(2,2)。。。(start,start)

结束条件:columns>start*2 && rows>start*2

2、如何打印一圈:

分为四步:1、从左到右打印一行(上);2、从上到下打印一列(右);3、从右到左打印一行(下);4、从下到上打印一列(左)

每一步根据起始坐标和终止坐标用一个循环就可以打印一行或一列,但并不是每一圈都需要打印四次,有些圈可能退化为一行或一列或其他,需要考虑每一步打印的前题条件;

3、每一步打印的前提条件:

第一步:没有,一定需要的;

第二步:终止行号大于起始行号;

第三步:终止行号大于起始行号&&终止列号大于起始列号;

第四部:终止行号大于起始行号+1,&&终止列号大于起始列号;

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. void PrintMatrixInCircle(int** numbers,int columns,int rows,int start){
  7. int endX=columns-1-start;
  8. int endY=rows-1-start;
  9.  
  10. // print from left to right
  11. for(int i=start;i<=endX;i++)
  12. printf("%d ",numbers[start][i]);
  13.  
  14. // print from top to bottom
  15. if(endY>start){
  16. for(int i=start+1;i<=endY;i++)
  17. printf("%d ",numbers[i][endX]);
  18. }
  19.  
  20. // print from right to left
  21. if(endY>start && endX>start){
  22. for(int i=endX-1;i>=start;i--)
  23. printf("%d ",numbers[endY][i]);
  24. }
  25.  
  26. // print bottom to top
  27. if(endX>start && endY>(start+1)){
  28. for(int i=endY-1;i>=start+1;i--)
  29. printf("%d ",numbers[i][start]);
  30. }
  31. }
  32.  
  33. void PrintMatrixClockwisely(int** numbers,int columns,int rows){
  34. if(numbers==NULL || columns<=0 || rows<=0)
  35. return;
  36. int start=0;
  37. while(columns>start*2 && rows>start*2){
  38. PrintMatrixInCircle(numbers,columns,rows,start);
  39. ++start;
  40. }
  41. printf("\n");
  42. }
  43.  
  44. int main()
  45. {
  46. const int M=4;
  47. const int N=4;
  48. /*
  49. int** array=new int*[M];
  50. for(int i=0;i<M;i++)
  51. array[i]=new int[N];
  52. */
  53. int** array=(int **)malloc(M *sizeof(int *));
  54. for(int i=0;i<M;i++)
  55. array[i] = (int *)malloc(N *sizeof(int));
  56.  
  57. int k=1;
  58. for(int i=0;i<M;i++){
  59. for(int j=0;j<N;j++)
  60. array[i][j]=k++;
  61. }
  62.  
  63. PrintMatrixClockwisely(array,M,N);
  64.  
  65. for(int i=0;i<M;i++){
  66. free(array[i]);
  67. array[i] = NULL;
  68. }
  69. free(array);
  70. array=NULL;
  71.  
  72. return 0;
  73. }

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/9b4c81a02cd34f76be2659fa0d54342a?rp=1

AC代码:

  1. class Solution {
  2. public:
  3. void PrintMatrixInCircle(const vector<vector<int> > &matrix,vector<int> &mat,int rows,int columns,int start){
  4. int endX=columns-1-start;
  5. int endY=rows-1-start;
  6.  
  7. // print from left to right
  8. for(int i=start;i<=endX;i++)
  9. mat.push_back(matrix[start][i]);
  10. //printf("%d ",numbers[start][i]);
  11.  
  12. // print from top to bottom
  13. if(endY>start){
  14. for(int i=start+1;i<=endY;i++)
  15. mat.push_back(matrix[i][endX]);
  16. //printf("%d ",numbers[i][endX]);
  17. }
  18.  
  19. if(endY>start && endX>start){
  20. for(int i=endX-1;i>=start;i--)
  21. mat.push_back(matrix[endY][i]);
  22. //printf("%d ",numbers[endY][i]);
  23. }
  24.  
  25. if(endX>start && endY>(start+1)){
  26. for(int i=endY-1;i>=start+1;i--)
  27. mat.push_back(matrix[i][start]);
  28. //printf("%d ",numbers[i][start]);
  29. }
  30. }
  31. vector<int> printMatrix(vector<vector<int> > matrix) {
  32. int rows=matrix.size();
  33. int columns=matrix[0].size();
  34. int start=0;
  35. vector<int> mat;
  36. while(columns>2*start && rows>2*start){
  37. PrintMatrixInCircle(matrix,mat,rows,columns,start);
  38. ++start;
  39. }
  40. return mat;
  41. }
  42. };

(剑指Offer)面试题20:顺时针打印矩阵的更多相关文章

  1. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  2. 剑指 offer面试题20 顺时针打印矩阵

    [题目描述] 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  3. 【剑指offer】题目20 顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1   2   3  4 5   6   7  8 9  10 11 12 13 14 15 16 则依次打印出 ...

  4. 剑指Offer - 九度1391 - 顺时针打印矩阵

    剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...

  5. 剑指offer十九之顺时针打印矩阵

    一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  6. 剑指offer(19)顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  7. 【剑指Offer】19、顺时针打印矩阵

      题目描述:   输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依 ...

  8. 牛客网剑指offer第19题——顺时针打印矩阵

    这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  9. 剑指offer面试题5 从头到尾打印链表(java)

    注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...

  10. 剑指offer面试题5 从头到尾打印链表(c)

随机推荐

  1. RandomAcessFile、MappedByteBuffer和缓冲读/写文件

    项目需要进行大文件的读写,调查测试的结果使我决定使用MappedByteBuffer及相关类进行文件的操作,效果不是一般的高. 网上参考资源很多,如下两篇非常不错: 1.花1K内存实现高效I/O的Ra ...

  2. SNIFFER问题集锦

    SNIFFER相关教程下载: Sniffer使用教程.pdf|Sniffer用法.ppt 具体问题解决: 1.SNIFFER4.75无法使用,打开后提示 No adapter is binding t ...

  3. C++抽象机制之二:运算符重载

    1.二元运算符aa@bb,可以定义为 1).一个参数的非静态成员函数:aa.operator@(bb);  (成员函数有this指针) 2). 两个参数的非成员函数:operator@(aa,bb); ...

  4. 二叉树单色路径最长&&穿珠子

    对树的操作,特别理解递归的好处. //对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的 //另一点结束而形成的路径,而路 ...

  5. 初识 istringstream、ostringstream、stringstream 运用

    今天编程练习时遇到了istringstream的用法,感觉很实用.后面附题目! C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O 1.头文件  # ...

  6. 遵守GPL的开源软件能用于商用吗?

    遵守GPL的开源软件能用于商用吗? 比较经典的开源协议有 GPL,BSD 等等. GPL 软件可以用于商业用途,甚至说,RMS 撰写 GPL 协议的目的就是为了让自己的 GPL 软件 emacs 可以 ...

  7. 使用gulp、yeoman、bower建站

    前端建站工具 标签 : 工具 *** 脚手架:yeoman 用途 快速搭建新项目 为项目增加新部分 创建模块或者包 引导新服务 ... 开始 安装yo和generator npm i -g yo np ...

  8. HDU ACM 1515 Anagrams by Stack

    Anagrams by Stack Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. hdu4421-Bit Magic(2-SAT)

    题意 根据图中公式由A[]构造B[][],现在给你B,问你存不存在一个数组A使之成立. 题解:对于每一位进行2-sat求解. 比赛半个小时时间,没做出来…… 一直T. 因为本身对算法不确定,所以也不知 ...

  10. HashSet与HashMap、Hashtable

    (最近在老师叫我们用java去实现LRU算法,了解到要用双链表去做,要用到LinkHashMap去做,但自己对java的几大集合框架并不熟悉,在学习过程了解到了HashMap和HashSet,做个简单 ...