(剑指Offer)面试题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.
思路:
把矩阵想象成若干个圈,通过循环操作来打印矩阵,每次打印矩阵中的一个圈;
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:顺时针打印矩阵的更多相关文章
- 剑指Offer:面试题20——顺时针打印矩阵(java实现)
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 剑指 offer面试题20 顺时针打印矩阵
[题目描述] 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 【剑指offer】题目20 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出 ...
- 剑指Offer - 九度1391 - 顺时针打印矩阵
剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...
- 剑指offer十九之顺时针打印矩阵
一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- 剑指offer(19)顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- 【剑指Offer】19、顺时针打印矩阵
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依 ...
- 牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- 剑指offer面试题5 从头到尾打印链表(java)
注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...
- 剑指offer面试题5 从头到尾打印链表(c)
随机推荐
- aspose.word使用简单方法
概念介绍 使用aspose生成word报表步骤: 加载word模板 提供数据源 填充 加载模板 提供了4种重载方法 public Document(); public Document(Stream ...
- 查询mysql数据库表的信息(表大小、数据大小、索引大小)
select * from information_schema.TABLES where information_schema.TABLES.TABLE_SCHEMA='databasename' ...
- 用VS2010打开vs2008
用VS2010打开vs2008,对应的9.0.0.0版本,而应该该使用版本10.0.0.0 解决方案:修改配置文件.将Microsoft.ReportViewer的版本为9.0.0.0改为10.0.0 ...
- Windows 和 Linux 的IPC API对应表
原文出处:http://blog.csdn.net/zhengdy/article/details/5485472 ...
- [转]linux 下使用dump和restore命令
转自:http://blog.sina.com.cn/s/blog_63eb479a01011sdu.html dump 支持分卷和增量备份(所谓增量备份是指备份最近一次备份以来修改过的文件,也称差异 ...
- cocos2d-x 全面总结--字体描边和制作阴影
关于字体描边的实现,不考虑效果和效率的话,是有三种方式: ① 利用CCLabelTTF制作文字描边和阴影效果 ② 利用CCRenderTexture渲染文理的方式生成带有描边效果的文字 ③ 利用sha ...
- Python 以指定概率获取元素
这是Python cookbook的示例 1 def random_pick(some_list,probabilities): 2 x=random.uniform(0,1) 3 cumulativ ...
- [转载]我读过最好的Epoll模型讲解
转载来自:http://blog.csdn.net/mango_song/article/details/42643971 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行 ...
- N皇后问题--回溯法
1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每 ...
- easyui不提交window中的form表单数据
<form id="ff" method="post">, <div id="win" class="easyu ...