记得这是我在Google面试的时候,被问到的一个问题。关于顺时针打印矩阵问题描述,大家可以搜索下题目,大致信息如下:
给定一个m*n的矩阵,要求,从外层顺时针打印一直到打印完所有元素,
如:
1、2*2矩阵
1 2
3 4
输出:1 2 4 3
2、3*4矩阵
1 2 3 4
5 6 7 8
9 1 2 3
输出:1 2 3 4 8 3 2 1 9 5 6 7
乍一看,这道题挺简单,尤其在面试时,以最快速度写出代码为目标,直接用4个for循环手写代码。但在写的过程中,发现要注意的边界问题很多,但最后还是磕磕绊绊写完了。之后没再考虑了,直到最近偶然看到网上的一些解法,遂觉得是否有更优雅的写法。经过思考,其实只需要考虑矩阵的四个坐标,通过四个坐标的边界来控制即可。每次循环完最外层,四个边界缩小一层即可。最后再通过是否有打印输出作为最外层循环结束条件即可。这样一来,只通过一个for循环搞定,从而以最优雅的方法完美解决该问题。同时,最少的循环,避免复杂的边界判断。
废话不多说,直接上代码,欢迎拍砖。
public class Test {
private boolean valid(int cc, int m, int n){
if( cc >= m && cc <= n ){
return true;
}
return false;
}
public void print(int m, int n, int a[][], boolean visited[][]){
int offsetX[] = new int[]{0,1,0,-1};
int offsetY[] = new int[]{1, 0, -1, 0};
int sX = 0, eX = n - 1;
int sY = 0, eY = m - 1;
boolean flag = false;
do{
if( sX > eX || sY > eY ){
break;
}
int xTmp = sX;
int yTmp = sY;
for( int ii = 0; ii < offsetX.length;){
if( valid( xTmp, sY, eY) && valid(yTmp, sX, eX) && !visited[xTmp][yTmp]){
System.out.print(a[xTmp][yTmp]+"\t");
visited[xTmp][yTmp] = true;
flag = true;
}
if( valid(xTmp + offsetX[ii], sY, eY) && valid(yTmp + offsetY[ii], sX, eX) ){
xTmp += offsetX[ii];
yTmp += offsetY[ii];
}else{
ii++;
}
}
sX++;
eX--;
sY++;
eY--;
}while( flag );
}
public static void main(String[] args) {
int a[][];
int m = (int)(Math.random() * 5)+1;
int n = (int)(Math.random() * 5)+1;
// m = 10;
// n = 1;
a = new int[m][n];
boolean visited[][] = new boolean[m][n];
System.out.println( m + " * " + n);
for( int i = 0; i < m; i++ ){
for( int j = 0; j < n; j++ ){
int tmp = (int)(Math.random() * 10);
a[i][j] = tmp;
visited[i][j] = false;
System.out.print(tmp+"\t");
}
System.out.println();
}
System.out.println();
System.out.println("顺时针打印:");
Test t = new Test();
t.print(m, n, a, visited);
}
}
不用考虑打印方向,只通过一个for循环,优雅完成顺时针打印任务。尽可能少的判断边界条件,从而减少错误概率。
分享到:
相关推荐
java实现顺时针打印矩阵是一种常见的算法问题,其目的是将一个矩阵按照顺时针的顺序打印出所有元素。这种问题的解决方案有多种,其中一种常见的方法是使用分圈处理的方式,即将矩阵分解成多个子矩阵,然后逐步打印出...
顺时针打印矩阵是一种常见的编程问题,主要出现在算法和数据结构的学习中,例如在LeetCode等在线编程平台上的题目。这个问题的目标是给定一个二维矩阵,按照顺时针方向从外向内依次打印矩阵中的所有元素。这个问题...
顺时针打印矩阵.md
### Python 实现顺时针打印矩阵 #### 一、问题背景与定义 在计算机科学领域,数组和矩阵操作是常见的编程任务之一。本篇文章将详细探讨如何使用 Python 实现顺时针打印矩阵的问题。该问题通常出现在算法设计、数据...
Java 顺时针打印矩阵是一种常见的算法问题,要求从外向里以顺时针的顺序依次打印出每一个数字。例如,输入一个矩阵: 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、...
在PHP中实现顺时针打印矩阵需要对二维数组进行特定的遍历算法。在给定的文件信息中,提供了一段PHP代码示例,展示了如何通过设定边界变量并逐步缩小范围的方法,按顺时针顺序打印出矩阵中的所有元素。 以下是对该...
本篇文章将深入探讨如何使用Golang语言实现顺时针打印矩阵的功能,并通过具体的代码实例进行说明。 #### 顺时针打印矩阵问题描述 假设有一个二维矩阵(即由多个数组构成的数组),要求按顺时针方向打印出矩阵中的...
Java 实现转圈打印矩阵算法是指将一个整形矩阵按照顺时针方向转圈的方式,输入(打印)元素值。该算法的实现可以分为两个部分:矩阵的初始化和转圈打印。 矩阵的初始化 在 Java 中,可以使用二维数组来表示矩阵。...
我的算法是顺时针旋转矩阵的同心圆 首先,输入矩阵应具有的维数(必须为正方形矩阵)。 该矩阵将由整数组成。 其次,将矩阵中的数字逐行输入,并用空格隔开。 请参阅下面的输入和输出示例。 程序输入: 2 1 2 ...
螺旋矩阵是一种特殊的矩阵排列方式,它的特点是按照顺时针或者逆时针方向,从左上角开始,依次填充矩阵的元素。在编程面试中,螺旋矩阵的实现常常被用来考察候选人的逻辑思维和数据结构处理能力。在这个问题中,我们...
在C++中实现螺旋矩阵算法,可以分为以下几个关键步骤: 1. **初始化**: 创建一个二维数组,其大小根据矩阵的阶数确定。阶数可以是奇数或偶数,这将影响螺旋路径的方向。 2. **设定初始位置**: 对于奇数阶的矩阵,1...
内螺旋矩阵算法是一种在二维数组中填充数字的特殊方式,其特点是数字按顺时针方向从数组中心向外螺旋式地填充。这种填充模式在数据结构和算法的学习中颇为有趣,因为它涉及到了数组的操作以及对角线元素的处理。在...
在处理普通矩阵时,代码通过四层循环来实现顺时针打印。外层循环变量`o`控制当前正在打印的层,从外层向内层逐步处理,每层打印完后再处理下一层。内层循环负责打印当前层的四个边缘,分别是上边缘、右边缘、下边缘...
请设计算法完成螺旋阵的输出,具有要求为:输入一个m行n列的矩阵,按顺时针螺旋顺序输出矩阵中的所有元素。 【输入】 第1行输入两个正整数m和n,表示m行n列的矩阵; 从第2行开始按行输入该矩阵的所有元素。 【输出】...
在给定的场景中,我们需要实现一个程序,能够根据用户输入的数字n生成一个n×n的螺旋矩阵,并打印出来。例如,当输入为3时,输出的矩阵是: ``` 1 8 7 2 9 6 3 4 5 ``` 在这个螺旋矩阵中,数字从1开始,按照顺时针...
打印矩阵的方式与顺时针矩阵的打印方式相同。 在MATLAB中,实现螺旋矩阵可能更简洁,因为MATLAB提供了一些内置函数可以简化这种操作。例如,可以使用线性索引和`reshape`函数来创建螺旋矩阵,或者通过巧妙地调整索...
打印螺旋矩阵是编程中的一个经典问题,它涉及到数组操作和循环控制。在本问题中,我们需要创建一个M*N的螺旋矩阵,并进行打印。同时,题目还提到了计算N*N矩阵的行列式的值,这是一个线性代数中的概念。 首先,让...
螺旋矩阵和折线矩阵是两种在计算机科学中处理二维数组,特别是矩阵时常见的算法。它们在数据结构和算法设计中有着独特的应用,特别是在图形处理、矩阵运算和数据存储等方面。 **螺旋矩阵** 是一种将一个n×n的矩阵...
2. 环绕填充:从矩阵的左上角开始,按顺时针方向填充第一圈元素。我们可以用两个指针i和j分别表示行和列,随着元素的增加,适时调整行和列的增减方向。 3. 内部循环:当一圈填充完毕后,我们需要跳过内部已经填充过...
螺旋矩阵是一种特殊的矩阵布局方式,它按照顺时针或逆时针方向螺旋式地填充数字。这个主题涉及到矩阵、算法和线性代数等IT领域的基础知识。以下是对三种不同的螺旋矩阵实现方法的详细说明: 1. 第一种实现是用C语言...