华为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("
");
        for(int j=0;j<N;j++)
            printf("%d	",a[i][j]);
    }    
    printf("
");
    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("
");
        for(int j=0;j<N;j++)
                printf("%d	",a[i][j]);
    }
    printf("
");
    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

原文地址:https://www.cnblogs.com/fuxianfeng1988/p/3291613.html