华为2013年9月技术面面试题(一)
这题是螺旋数组问题,下面是自己用C写的代码:
题一:例如输入5,打印出如下数组
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
若输入n,则打印出与上述例子中规律相同的NXN数组。
#include <stdlib.h> #include <stdio.h> #define N 9 void Output_Matrix(int n); int a[10][10]; int main() { Output_Matrix(N); for(int i=0;i<N;i++) { printf("\n"); for(int j=0;j<N;j++) printf("%d\t",a[i][j]); } printf("\n"); return 0; } void Output_Matrix(int n) { int m=1,i,j; for(i=0;i<=n/2;i++) //i表示第i层,假设最外面那一层表示0层 { for(j=i;j<n-i;j++) //行号为i,列号的范围为i到n-i-1 a[i][j]=m++; for(j=i+1;j<n-i;j++) //列号为n-i-1,行号范围为i+1到n-i-1 a[j][n-1-i]=m++; for(j=n-1-i;j>i;j--) //行号为n-i-1,列号范围为n-1-i到i+1 a[n-1-i][j-1]=m++; for(j=n-1-i;j>i;j--) //列号为i,行号范围为n-1-i到i+1 a[j][i]=m++; } }
上述题需要找出最外层的规律即可,其他层同理。
若是如下规律呢?
21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
若规定第0层为中间那个1,则我们需要找出第1层四个方向上规律即可,其他层同理向外扩展。
这题可以按照上题中的逆序来处理,即从最大值递减由外向里延伸。也可以按里向外延伸处理,如下:
从上图中我们可以看出规律:第1层的各边有2个数,第2层的各边有4个数......第N层的各边有2*N个数....
下面是由里向外延伸的C代码:
#include<stdio.h> #include<stdlib.h> #define N 9 int a[20][20]; void Print_Matrix(int n); int main() { Print_Matrix(N); //打印数组 for(int i=0;i<N;i++) { printf("\n"); for(int j=0;j<N;j++) printf("%d\t",a[i][j]); } printf("\n"); return 0; } void Print_Matrix(int n) { int m=1,i,j; a[n/2][n/2]=m++; int k=n/2; //k表示第0层的行和列号 for(i=0;i<=n/2;i++) { for(j=k-i+1;j<=k+i;j++) //第i层的各个方向分别有2*i个数据,数值与行号同向递增,所在列号为k+i,行号范围为k-i+1到k+i, a[j][i+k]=m++; for(j=k+i-1;j>=k-i;j--) //数值与列号反向递减,所在行号为k+i, 列号范围为k+i-1递减到k-i a[i+k][j]=m++; for(j=k+i-1;j>=k-i;j--) //数值与行号反向递减,所在列号为k-i,行号范围为k+i-1到k-i a[j][k-i]=m++; for(j=k-i+1;j<=k+i;j++) //数值与列号同向递增,所在行号为k-i,列号范围为k-i+1递增到k+i, a[k-i][j]=m++; } }
运行结果:
程序员面试宝典P93~~中也有一题讲螺旋数组,题目是:看清以下数字排列规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如,7的坐标为(-1,-1),2的坐标为(0,1),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字【芬兰著名软件公司2005年面试题】
这里有详细的解释http://blog.csdn.net/forgotaboutgirl/article/details/6780548