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