剑指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 ...
随机推荐
- Centos6.5安装python2.7与pip
安装Python2.7 安装环境 [root@localhost1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@local ...
- 关于在asp.net添加jQuery的智能提示
如果是vs2008以后的版本,一般都会支持jQuery自动提示代码功能,不支持也没关系,很简单的操作就能支持: 1.先为vs下载一个补丁,地址为:http://code.msdn.microsoft. ...
- 关于ENABLE_BITCODE
pod 'TSVoiceConverter' 如果,设置了工程target的ENABLE_BITCODE为NO.但是,在真机上运行时,仍然提示类似于如下错误: URGENT: all bitcode ...
- openlayers2地图控件扩展:要素删除DeleteFeature
实现要素删除控件,扩展OpenLayers.Control类,实现效果:选择DeleteFeature工具后,选择要素,按delete键删除要素(这里的删除只是将feature设置成delete状态, ...
- Spring -- spring结合aop 进行 tx&aspectj事务管理配置方法
1. tx 配置方法, 代码示例 javabean及其映射文件省略,和上篇的一样 CustomerDao.java, dao层接口 public interface CustomerDao { pub ...
- scala学习手记23 - 函数值
scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...
- Android中getDimension,getDimensionPixelOffset和getDimensionPixelSize 区别
getDimension 获取某个dimen的值,如果是dp或sp的单位,将其乘以density,如果是px,则不乘 返回float getDimensionPixelOffset 获取某个dim ...
- LeetCode第[48]题(Java):Rotate Image
题目:矩阵旋转 难度:Medium 题目内容: You are given an n x n 2D matrix representing an image. Rotate the image by ...
- Django开发点菜系统学习笔记
1.使用django-simple-captcha包的时候,会调用到: register_form = RegisterForm(request.POST) 但是这个时候captcha不进行错误检验, ...
- python 正则表达式使用
正则表达式总结: python支持的字符和语法:. 匹配任意除换行符\n 之外的所有字符\ 转义字符 比如说要匹配的字符中含有 \ . * 等可以使用\转义 例如 \* \. \\[.....] 直接 ...