剑指offer-第四章解决面试题的思路(顺序打印矩阵)
题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数。(画图让抽象的问题形象化)
思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件。

从上图中我可以看到一个6*6的矩阵(长宽分别为cloums,rows)最后一圈的最左边的顶点上面的坐标为(2,2),我们同时发现在一个5*5的矩阵中最后一圈的最左边的顶点的坐标也为(2,2),并且这个顶点的坐标的横坐标和纵坐标是相同的暂且设置为(start,start),因此我们可以得到截止条件即为,cloums>startX*2,rows>startY*2.并且我们同时发现打印没一圈的时候都是同样的操作,因此,我们可以使用递归来完成该操作。
打印每一圈的情况如下图所示:

C++代码:
#include<iostream>
using namespace std;
void printMatrixInCircle(int** numbers,int cloums,int rows,int start)
{
int endx=cloums--start;
int endy=rows--start;
//从左到右打印
for(int i=start;i<=endx;i++)
{
int number=numbers[start][i];
cout<<number<<" ";
} //从上到下打印
if(start<endy)
{
for(int i=start+;i<=endy;i++)
{
int number=numbers[i][endx];
cout<<number<<" ";
}
}
//从右到左打印
if(start<endx&&start<endy)
{
for(int i=endx-;i>=start;i--)
{
int number=numbers[endx][i];
cout<<number<<" ";
}
}
//从下到上打印
if(start<endx&&start<endy-)
{
for(int i=endy-;i>=start+;i--)
{
int number=numbers[i][start];
cout<<number<<" ";
}
}
}
void printMatrixClockWisely(int** numbers,int cloums,int rows)
{
if(numbers==NULL||cloums<=||rows<=)
return;
int start=;
while(cloums>start*&&rows>start*)
{
printMatrixInCircle(numbers,cloums,rows,start);
start++;
cout<<endl;
} } void main()
{
int a[][]={{,,},{,,},{,,}};
int** b=new int*[];
for(int i=;i<;i++)
{
b[i]=a[i];
}
printMatrixClockWisely(b,,);
}
Java代码:
public class PrintMatrix {
public static void printMatrixInCircle(int[][] numbers,int cloums,int rows,int start)
{
int endx=cloums--start;
int endy=rows--start;
//从左到右打印
for(int i=start;i<=endx;i++)
{
int number=numbers[start][i];
System.out.print(number+" ");
}
//从上到下打印
if(start<endy)
{
for(int i=start+;i<=endy;i++)
{
int number=numbers[i][endx];
System.out.print(number+" ");
}
}
//从右到左打印
if(start<endx&&start<endy)
{
for(int i=endx-;i>=start;i--)
{
int number=numbers[endx][i];
System.out.print(number+" ");
}
}
//从下到上打印
if(start<endx&&start<endy-)
{
for(int i=endy-;i>=start+;i--)
{
int number=numbers[i][start];
System.out.print(number+" ");
}
}
}
public static void printMatrixClockWisely(int[][] numbers,int cloums,int rows)
{
if(numbers==null||cloums<=||rows<=)
return;
int start=;
while(cloums>start*&&rows>start*)
{
printMatrixInCircle(numbers,cloums,rows,start);
start++;
System.out.println();
}
}
public static void main(String[] args)
{
int a[][]={{,,},{,,},{,,}};
printMatrixClockWisely(a,,);
}
}
剑指offer-第四章解决面试题的思路(顺序打印矩阵)的更多相关文章
- 剑指offer第四章
剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...
- 剑指offer-第四章解决面试题的思路(从上往下打印二叉树)
题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印 思路:这是一个层序遍历的问题,因此要借用到队列.我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子 ...
- 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)
题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...
- 剑指offer-第四章解决面试题的思路(包含min函数的栈)
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂度都是O(1) 思路:定义两个栈分别为dataStack和minStack ...
- 剑指offer-第四章解决面试题的思路(二叉树的镜像)
题目:请完成函数,输入一个二叉树,该函数输出它的镜像. 思路:可能没有听说过书的镜像,但是可以通过画图等来找灵感.就像照镜子一样,人的左边和右边交换了. 如图: 通过如下图变化就可以由左图得到右图: ...
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 剑指offer第七章&第八章
剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...
- 剑指offer第六章
剑指offer第六章 1.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,所以输出4 分析:思路1 ...
- 剑指offer第三章
剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...
随机推荐
- Python面试题之容器(Collections)
容器(Collections) Python附带一个模块,它包含许多容器数据类型,名字叫作collections.我们将讨论它的作用和用法. 我们将讨论的是: defaultdict coun ...
- Go语言学习之常量(The way to go)
生命不止,继续go go go . 上一篇博客<Go语言学习之变量(The way to go)介绍了go中的变量,今天就介绍常量. const关键字 跟c++中一样,go中同样具有const关 ...
- CVE补丁安全漏洞【学习笔记】
更新安卓系统的CVE补丁网站:https://www.cvedetails.com/vulnerability-list/vendor_id-1224/product_id-19997/version ...
- [CTSC2008]祭祀river
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- 对拷 使用scp命令在两台linux上对拷文件或者文件夹
以前一直是在服务器上tar打包压缩,下载到本地电脑上,再上传到另外一台服务器上,再解压. 其实使用scp命令就可以直接对拷文件或者文件夹了. scp就是secure copy,是用来进行远程文件拷贝的 ...
- 移动端给img元素添加content: "";
误给img原始添加 content: "";属性后发现在ios系统中图片是不会显示的android系统是正常的
- Web Service简介
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...
- JNI_Z_08_创建Java对象
1.步骤 : (1).获取 jclass (2).获取 构造函数的 method id (方法的名称始终为"<init>") (3).创建Java对象的两种方式: (3 ...
- Java 各种锁的小结
一. synchronized 在 JDK 1.6 之前,synchronized 是重量级锁,效率低下. 从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁.轻量级锁.自旋锁 ...
- git如何回滚远程仓库
git如何回滚远程仓库 http://www.cnblogs.com/iloveyou-sky/p/6534409.html