我试图以螺旋方式打印mxn大小的矩阵。我尝试通过Java来处理这段代码,如果rows = columns,我能够正确打印螺旋。 对于不相等的行和列,我倾向于重复打印。因此它会正确地打印到中心,然后重复一个或多个元素。我尝试过调试但无法达到远程。 谁能帮我这个? 这是我到目前为止的代码。
public class SpiralMatrix {
public static void main (String args[]){
int[][] mat = { {1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11,12, 13, 14, 15}};
int i,n=3,m=5,r=m-1,q=n-1;
while(q>0 && r>0){
for(i=m-1-r;i<=r;i++){
System.out.println(mat[m-1-r][i]);
}
for(i=n-1-q+1;i<=q;i++){
System.out.println(mat[i][r]);
}
for(i=r-1;i>=m-1-r;i--){
System.out.println(mat[q][i]);
}
for(i=q-1;i>=n-1-q+1;i--){
System.out.println(mat[i][n-1-q]);
}
q--;
r--;
}
}
}
输出如下:
1
2
3
4
5
10
15
14
13
12
11
6
7
8
9
8
7
因此在达到中间值9后,它追溯到8和7。 PS:这不是作业,我正在磨练我的采访技巧。请放轻松我,我是一个终身学习者! 谢谢!我将非常感谢你的帮助。
答案 0 :(得分:1)
在this question中对此进行了讨论,你可以在那里看到很多答案。
我的答案是this one。
似乎你只是打印太多了,它似乎来自第三个内部for循环(在其他情况下,当高度超过宽度时,可能来自第四个for循环)。
那是因为你是从右到左(第三个内圈for循环)打印,尽管高度(q
)是一个。这是一个错误,因为如果高度为1,那条线将由第一个内部for循环打印。因此,只有在高度大于1时才需要打印条件。第四个内部循环就是这种情况。
public class SpiralMatrix {
public static void main (String args[]){
int[][] mat = { {1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11,12, 13, 14, 15}};
int i,n=3,m=5,r=m-1,q=n-1;
while(q>0 && r>0){
for(i=m-1-r;i<=r;i++){
System.out.println(mat[m-1-r][i]);
}
for(i=n-1-q+1;i<=q;i++){
System.out.println(mat[i][r]);
}
for(i=r-1;i>=m-1-r && q>1;i--){
System.out.println(mat[q][i]);
}
for(i=q-1;i>=n-1-q+1 && r>1;i--){
System.out.println(mat[i][n-1-q]);
}
q--;
r--;
}
}
}
答案 1 :(得分:0)
public class SpiralMatrix {
public static void main(String[] args) {
int a[][] = {{1, 2, 3, 4,21,26},
{5, 6, 7, 8,22,27},
{9, 10, 11, 12,23,28},
{13,14,15,16,24,29},
{17,18,19,20,25,30},
{31,32,33,34,35,36}};
System.out.println(a[0].length);
for(int i=0; i<6; i++) {
for(int j=0;j<6;j++){
System.out.print(a[i][j] + " , ");
}
System.out.println();
}
int m=6,n=6;
for (int i=0;i<m;i++) {
int j=i;
for(;j<n;j++){
System.out.print(a[i][j] + " , ");
}
for(j=i+1;j<m;j++) {
System.out.print(a[j][n-1] +" , ");
}
for(j=n-2;j>=i;j--){
System.out.print(a[m-1][j] + " , ");
}
for(j=m-2;j>i;j--){
System.out.print(a[j][i] + " , ");
}
m=m-1;
n=n-1;
}
}
}
//tried to simplfy the code to print a square matrix spiral way.
//complete code given, please post if feel any modification required.
答案 2 :(得分:0)
每次机器人转动90度时你需要一个if条件!
public static Stack<int> SpiralTraverse(int[,] arr)
{
Stack<int> trav = new Stack<int>();
int m = arr.GetLength(0)-1; //end point (m,n)
int n = arr.GetLength(1)-1;
int k = 0; int l = 0; // starting point (k,l)
int i; //index
while( k <= m && l <= n)
{
for (i= l; i <= n; i++)
{
trav.Push((int)arr[k, i]);
}
k++;
for (i = k; i <= m; i++)
{
trav.Push((int)arr[i, n]);
}
n--;
if (k < m)
{
for (i= n;i>= l; i--)
{
trav.Push((int)arr[m,i]);
}
m--;
}
if (l < n)
{
for (i= m;i>= k; i--)
{
trav.Push((int)arr[i, l]);
}
l++;
}
}
return trav;
}