创新工场面试题——输出螺旋矩阵

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

一、定义

螺旋矩阵是什么?

什么是螺旋矩阵?以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                 else
40                 {
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 }

 

 

posted @ 2013-09-29 17:09  小桂子的博客  阅读(571)  评论(0编辑  收藏  举报