题目:

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

例如,如果输入如下矩阵: 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,&&终止列号大于起始列号;

代码:

#include <stdio.h>
#include <stdlib.h> using namespace std; void PrintMatrixInCircle(int** numbers,int columns,int rows,int start){
int endX=columns-1-start;
int endY=rows-1-start; // print from left to right
for(int i=start;i<=endX;i++)
printf("%d ",numbers[start][i]); // print from top to bottom
if(endY>start){
for(int i=start+1;i<=endY;i++)
printf("%d ",numbers[i][endX]);
} // print from right to left
if(endY>start && endX>start){
for(int i=endX-1;i>=start;i--)
printf("%d ",numbers[endY][i]);
} // print bottom to top
if(endX>start && endY>(start+1)){
for(int i=endY-1;i>=start+1;i--)
printf("%d ",numbers[i][start]);
}
} void PrintMatrixClockwisely(int** numbers,int columns,int rows){
if(numbers==NULL || columns<=0 || rows<=0)
return;
int start=0;
while(columns>start*2 && rows>start*2){
PrintMatrixInCircle(numbers,columns,rows,start);
++start;
}
printf("\n");
} int main()
{
const int M=4;
const int N=4;
/*
int** array=new int*[M];
for(int i=0;i<M;i++)
array[i]=new int[N];
*/
int** array=(int **)malloc(M *sizeof(int *));
for(int i=0;i<M;i++)
array[i] = (int *)malloc(N *sizeof(int)); int k=1;
for(int i=0;i<M;i++){
for(int j=0;j<N;j++)
array[i][j]=k++;
} PrintMatrixClockwisely(array,M,N); for(int i=0;i<M;i++){
free(array[i]);
array[i] = NULL;
}
free(array);
array=NULL; return 0;
}

在线测试OJ:

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

AC代码:

class Solution {
public:
void PrintMatrixInCircle(const vector<vector<int> > &matrix,vector<int> &mat,int rows,int columns,int start){
int endX=columns-1-start;
int endY=rows-1-start; // print from left to right
for(int i=start;i<=endX;i++)
mat.push_back(matrix[start][i]);
//printf("%d ",numbers[start][i]); // print from top to bottom
if(endY>start){
for(int i=start+1;i<=endY;i++)
mat.push_back(matrix[i][endX]);
//printf("%d ",numbers[i][endX]);
} if(endY>start && endX>start){
for(int i=endX-1;i>=start;i--)
mat.push_back(matrix[endY][i]);
//printf("%d ",numbers[endY][i]);
} if(endX>start && endY>(start+1)){
for(int i=endY-1;i>=start+1;i--)
mat.push_back(matrix[i][start]);
//printf("%d ",numbers[i][start]);
}
}
vector<int> printMatrix(vector<vector<int> > matrix) {
int rows=matrix.size();
int columns=matrix[0].size();
int start=0;
vector<int> mat;
while(columns>2*start && rows>2*start){
PrintMatrixInCircle(matrix,mat,rows,columns,start);
++start;
}
return mat;
}
};

(剑指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. spring.net IOC容器

    spring.net 通过配置文件的方式 帮我们实现了IoC功能,实现方式非常灵活,且多种多样. 点击查看 创建对象 我们只需定义接口和实现方法,spring.net帮我们实现了其他功能. 第一步,定 ...

  2. 别说你会用 Google 搜索

    Google 在我们的日常生活中越来越重要,很多时候,包括我在内的很多人一天也离不开 Google,但是,你真的会用 Google 吗?  PHP MySQL "Web developmen ...

  3. Android 下实现图片的移动

    网上看到的demo,感觉很有趣,但是 实用性不是太强,记录一下. 源码下载地址:请戳这里---------------->

  4. 支持 MBTiles 规范的预缓存

    SuperMap iServer 支持生成符合MBTiles规范的预缓存(MBTiles是由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范. 该规范由Ma ...

  5. 使用Jquery Mobile设计Android通讯录

    本系列教程将指导大家一步步使用Jquery Mobile设计一个Android的通讯录应用.其中在应用的界面部分,将使用jQuery Mobile框架,并且会指导大家如何使Android中提供的web ...

  6. Creole

    Home           Bisher besucht:    AnzeigenAnhängeInfo           The Creole 1.0 project has been succ ...

  7. 讲解HTML服务器推送相关技术知识(转)

    1. 为什么需要服务器推送? 最大的优点:实时 健康知识平台重庆男科医院 重庆妇科医院适用场景:实时股票价格.商品价格.实时新闻.Twitter/weibo timeline.基于浏览器的聊天系统 2 ...

  8. 成功BOSS的六大秘诀

    1.信念力 一个没有坚定信念的人,是不可能成为伟大企业家的.如果你认为自己行,你就一定行:如果你都认为自己不行了,那你就注定不行.在成功这条道路上,要勇敢地自我肯定和鼓励,这样才能带来巨大的创造力并最 ...

  9. Linux基本命令(8)网络操作的命令

    网络操作命令 命令 功能 命令 功能 ftp 传送文件 telnet 远端登陆 bye 结束连线并结束程序 rlogin 远端登入 ping 检测主机 netstat 显示网络状态 8.1 ftp命令 ...

  10. dzzoffice教程、文档、开发手册等内容地址

    dzzoffice教程.文档.开发手册等内容全部都存放在DzzOffice开发者社区的文集中.搜索引擎收录不到DzzOffice中的应用内容,这里将文集地址提供在这里. 地址:http://dev.d ...