(剑指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)
随机推荐
- Edit Control的Enter响应函数
Edit Control的Enter响应函数 在dialog中添加edit control ,选择“Multi_Line mode” MFC Class Wizard中添加Virtual Fu ...
- 大数据时代的技术hive:hive介绍
我最近研究了hive的相关技术,有点心得,这里和大家分享下. 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将 ...
- JS面向对象组件(三)--面向对象中的常用属性和方法
图片的由来看下面: 1.hasOwnProperty:看是不是对象自身下面的属性 var arr = []; arr.num = ; Array.prototype.num2 = ; //所有的数组对 ...
- Arduino 电平转换 升压 OUTPUT与9V/12V元件通信
原因 网络上有不少怎么让Arduino的5V电平转换成3.3V电平,从而和工作在3.3V下的芯片相互沟通的教程.但是如果想驱动高于5V电压的芯片,就找不到教程了.因此今天我来介绍一种方式,能让Ardu ...
- [整] Android Fragment 生命周期图
1. onAttach ------called once the fragment is associated with its activity 2. onCreate-------called ...
- windows系统下Python环境的搭建及Selenium的安装
1.首先访问http://www.python.org/download/去下载最新的python版本: 2.下载安装包,一路安装完毕: 3.为计算机添加安装目录搭到环境变量,如图把python的安装 ...
- php 在线 mysql 大数据导入程序
1 <?php header("content-type:text/html;charset=utf-8"); error_reporting(E_ALL); set_tim ...
- 【LeetCode】228 - Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- LeetCode(2) - Add Two Numbers
一道比较基本的LinkedList的题目.题目要求是这样,现在有两个LinkedList,(2 -> 4 -> 3)和(5 -> 6 -> 4),然后从头开始,把每个node ...
- poj 3299 Humidex
直接套公式就可以,可我套公式第一遍都错了,英语差的孩子伤不起(┬_┬) #include <iostream> #include <cmath> #include <io ...