(剑指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)
随机推荐
- poj 2127 LCIS 带路径输出
这个题 用一维 为什么错了: 因为 用一维 dp 方程肯定也是一维:但是有没有想,第 i 个字符更新了 j 位置的最优结果,然后 k 字符又一次更新了 j 位置的最优值,然后 我的结果是 i ...
- Javascript中的Keycode值列表
关于如何得到一个键在Javascript中的Keycode值,可以参考: <body onkeypress=alert(event.keyCode)>请按任意键,你将得到该键的键值! ke ...
- [Everyday Mathematics]20150226
设 $z\in\bbC$ 适合 $|z+1|>2$. 试证: $$\bex |z^3+1|>1. \eex$$
- ylb:子查询(嵌套子查询)和子查询(相关子查询)
ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...
- ylb:SQL Server中的时间函数
ylbtech-SQL Server:SQL Server-SQL Server中的时间函数 SQL Server中的时间函数. 1,SQL Server中的时间函数 返回顶部 1. 当前系统日期 ...
- YII Framework学习教程-YII的安全
web应用的安全问题是很重要的,在“黑客”盛行的年代,你的网站可能明天都遭受着攻击,为了从某种程度上防止被攻击,YII提供了防止攻击的几种解决方案.当然这里讲的安全是片面的,但是值得一看. 官方提供的 ...
- Windows 环境搭建cocos2dx 3.x Eclipse的环境
安装JDK,该步骤网上太多,不再赘述; 安装NDK,同样,直接去Google找到最新的NDK,下载解压到某个盘符根目录即可; 简便起见,使用ADT Bundle,而不要去使用Eclipse的原生包,可 ...
- 匿名函数自执行原理和instanceof运算符执行原理
今天收到RSS订阅中有一篇<Javascript – Arraylike的7种实现>,看第一种实现方式是,瞬间被!function(){}()这种匿名函数自执行方式给亮瞎了眼睛.这种写法绝 ...
- 实现3D摄像机缓冲系统的一些思考
最近需要模拟红侠乔伊的镜头运用.这东西初看简单,实际还是很需要功夫的.关键不是程序技术如何(就一个摄像机),而是分析其轨迹和追踪点规律.其实就是一个3D空间中的缓冲系统.你如何确定都有什么参数,这么多 ...
- Cassandra + Eclipse + Hadoop
配置好eclipse连接hadoop: 参考:http://www.powerxing.com/hadoop-build-project-using-eclipse/ http://blog.csdn ...