题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数。(画图让抽象的问题形象化)

思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件。

从上图中我可以看到一个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-第四章解决面试题的思路(顺序打印矩阵)的更多相关文章

  1. 剑指offer第四章

    剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...

  2. 剑指offer-第四章解决面试题的思路(从上往下打印二叉树)

    题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印 思路:这是一个层序遍历的问题,因此要借用到队列.我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子 ...

  3. 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)

    题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...

  4. 剑指offer-第四章解决面试题的思路(包含min函数的栈)

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂度都是O(1) 思路:定义两个栈分别为dataStack和minStack ...

  5. 剑指offer-第四章解决面试题的思路(二叉树的镜像)

    题目:请完成函数,输入一个二叉树,该函数输出它的镜像. 思路:可能没有听说过书的镜像,但是可以通过画图等来找灵感.就像照镜子一样,人的左边和右边交换了. 如图: 通过如下图变化就可以由左图得到右图: ...

  6. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  7. 剑指offer第七章&第八章

    剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...

  8. 剑指offer第六章

    剑指offer第六章 1.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,所以输出4 分析:思路1 ...

  9. 剑指offer第三章

    剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...

随机推荐

  1. function func(){} 与 var func=function(){}的区别

    1  var func =function(){}  ,即和 var 变量的特性 一样. func 变量名提前,但是不会初始化,直到执行到初始化代码. 2  function func(){}     ...

  2. GPL协议本身就是剥削,oracle维权玩的让人恶心

     我们先来看一下MySQL的版权问题.当前,MySQL采用双重授权(Dual Licensed),他们是GPL和MySQL AB制定的商业许可协议.如果你在一个遵循GPL的自由(开源)项目中使用MyS ...

  3. Python3.x:pyodbc调用sybase的存储过程

    Python3.x:pyodbc调用sybase的存储过程 示例代码 # python3 # author lizm # datetime 2018-03-02 17:00:00 # -*- codi ...

  4. 手动漏洞挖掘-SQL注入(安全牛笔记)

    substring_index(USER(),"@",l)-- #是将查询出来的结果进行切分,以@符号的方式切分 ’ union select table_name,table_s ...

  5. MySQL5.7导入数据报错ERROR 1067 (42000) at line 1015: Invalid default value for 'service_time'

    解决办法: 修改my.cnf,[mysqld] 下面添加sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_U ...

  6. Java基础之冒泡排序

    冒泡排序 基本介绍 冒泡排序是比较相邻的两个元素,通过不停的比较,较大的数往下沉,较小的往上冒,这也是冒泡排序名字的来源 第一趟从数组下标为0的数字开始,arr[0]大于arr[1]就交换他们的位置, ...

  7. Linux中df命令查询磁盘信息和fdisk命令分区的用法

    df - 报告文件系统磁盘空间的使用情况  总览 df [OPTION]... [FILE]... POSIX 选项: [-kP] GNU 选项 (最短方式): [-ahHiklmPv] [-t fs ...

  8. Kali Linux学习笔记

    1. 重装grub 重装windows后MBR被覆盖导致linux无法启动,通过U盘进入live后执行以下命令: mount /dev/sda5 /mnt //此处是将linux系统根目录挂载到mnt ...

  9. springboot--配置文件加载顺序

    -file:./config(内部配置) -file:./ (内部配置) -classpath:/config (外部配置) -classpath:/ (外部配置) 运维: spring -jar s ...

  10. spark集群安装

    cd到conf中去 修改名字   mv spark-env.sh.template spark-env.sh 并且修改内容 添加: export JAVA_HOME=/root/java/jdk1.8 ...