剑指offer-第四章解决面试题的思路(顺序打印矩阵)
2024-09-28 21:08:39
题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数。(画图让抽象的问题形象化)
思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件。
从上图中我可以看到一个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,,);
} }
最新文章
- spring访问静态资源出错,No mapping found for HTTP request with URI xxx/resources/js/jquery.min.js...
- 获取图片base64编码的几种方法
- JavaScript编码风格指南(中文版)
- FW: javascripts 要不要加引号
- Linux命令行--使用linux环境变量(转)
- 【转】ASP.NET Cookies简单应用 记住用户名和密码
- Cloud Insight支持阿里云一键接入了,so what?
- IDEA中添加各种依赖pom.xml文件内容
- 如何获取一个AlertDialog中的EditText中输入的内容
- Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)
- C++构造与析构
- 为什么要用深度学习来做个性化推荐 CTR 预估
- 【BZOJ2748】音量调节(动态规划)
- 在maven pom.xml中加载不同的properties ,如localhost 和 dev master等jdbc.properties 中的链接不一样
- 监控服务器配置(三)-----Node_exporter安装配置
- Android UiAutomator 快速调试
- 查看和修改 mysql库、表、字段编码
- Java 接口和抽象类区别(写的很好,转了)
- 在局域网内部实现远程web终端服务
- get the code of function in matlab