博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创新工场面试题——输出螺旋矩阵
阅读量:5811 次
发布时间:2019-06-18

本文共 3433 字,大约阅读时间需要 11 分钟。

      前些日子被叫去创新工场面试,经一番面试,面试知道我工程能力较强,算法比较差,就问了我一个算法题:输出螺旋矩阵。哎,这个题以前做过,有大致的想法,但是战场上就是写不出来。悲剧了,今天知道没戏了。

一、定义

螺旋矩阵是什么?

什么是螺旋矩阵?以n=4为例,其输出结果为:

  1   2   3     4

 12  13  14  5

 11  16  15  6

 10   9   8    7        

也即,       

 

看了上图,大致知道什么是螺旋矩阵了?

 

二、实现代码

 

1 int** Matrix(int n) 2 { 3     int** matrix; 4     matrix = new int*[n]; 5     int i =0,j =0,sum = 1; 6     int direction = 0; 7     int level = 0; 8     int all = n*n; 9     for (i = 0; i < n; i++)10     {11         matrix[i] = new int[n];12     }13 14     for (i = 0; i < n; i++)15     {16         for ( j = 0; j < n; j++)17         {18             matrix[i][j] = all;19         }20     }21     22     while(true)23     {        24         25         level += direction/ 4;26         direction = direction % 4;27         if(sum == all+1 )28         {29             break;            30         }31 32         switch (direction)33         {34             case 0:35                 if(n%2 && level == n/2)36                 {37                     matrix[level][level] =sum++;38                 }39                 else40                 {41                     for (j = level; j < n-(level + 1); j++)42                     {43                         matrix[level][j] = sum++;                            44                     }45                 }                46                 direction ++;                47                 break;48             case 1:49                 for (j = level ; j < n-level - 1; j++)50                 {51                     matrix[j][n-level -1] = sum++;52                 }53                 direction++;54             55                 break;56             case 2:57                 for (j = n- level - 1 ; j > level; j--)58                 {59                     matrix[n-level -1][j] = sum++;60                 }61                 direction++;62         63                 break;64             case 3:65                 for (j = n-level - 1 ; j > level; j--)66                 {67                     matrix[j][level] = sum++;68                 }69                 direction++;            70                 break;71         default:72             break;73         }        74     }75     return matrix;76 }

 

三、运行结果

刚测试的偶数没有问题,但是奇数有的问题,所以n*n在矩阵中是没有的,求大神解释和解决。

偶数结果:

 

奇数

 

实际了呢?

 

 

 附上递归方法:

1 void FillMatrix(int** matrix,int n,int level,int sum); 2 int** Matrix2(int n) 3 { 4     int** matrix; 5     matrix = new int*[n]; 6     int i =0,j =0;     7     for (i = 0; i < n; i++) 8     { 9         matrix[i] = new int[n];10     }11 12     for (i = 0; i < n; i++)13     {14         for ( j = 0; j < n; j++)15         {16             matrix[i][j] = 0;17         }18     }19 20     FillMatrix(matrix,n,0,1);21     return matrix;22 }23 24 void FillMatrix(int** matrix,int n,int level,int sum)25 {26     int j = 0;27     if(n%2 && level == n/2)28     {29         matrix[level][level] = sum++;30         return;31     }32     if(sum == n*n+1)33     {34         return;35     }36 37     for (j = level; j < n - level - 1; j++)38     {39         matrix[level][j] = sum++;40     }41 42     for (j = level; j < n - level - 1; j++)43     {44         matrix[j][n-level-1] = sum++;45     }46 47     for (j = n - level - 1; j > level; j--)48     {49         matrix[n - level - 1][j] = sum++;50     }51 52     for (j = n - level - 1; j > level; j--)53     {54         matrix[j][level] = sum++;55     }56 57     return FillMatrix(matrix,n,level+1,sum);58 }

 

 

 
 

转载于:https://www.cnblogs.com/xiaoguizi-buaa/p/3346069.html

你可能感兴趣的文章