zoukankan      html  css  js  c++  java
  • 华为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

  • 相关阅读:
    委托经典--由浅入深讲解
    原生的AJAX
    asp.net传值
    flex做的圣杯布局
    弹性盒布局实例
    CSS3实现的几个小loading效果
    requireJS基本概念及使用流程(2)
    require.js的基本概念及使用流程(1)
    JSz中的静态方法和实例方法的分析
    前端性能优化的方法
  • 原文地址:https://www.cnblogs.com/fuxianfeng1988/p/3291613.html
Copyright © 2011-2022 走看看