面试题一(蛇形输出)
题目的要求很简单,就是输出这样一个蛇形矩阵。。。
这道题是在面试亚马逊实习生时遇到的,当初的思路是针对每行元素的增加个数来编程,不过现在来想,按照每行元素增加的话要考虑的因素就太多了,不如这样以元素坐标来思考,来的简单明了。
下面以4阶矩阵为例:
由上图可得规律:
①坐标之和i + j = k - 1;
②k为奇数时,i为减,j为增;偶数时,i为增,j为减;
③当k <= n 时,元素坐标以0为起点递增(相应另一坐标递减),元素个数递增;
④当k > n 时,元素坐标以n - 1为起点递减(相应另一坐标递增),元素个数递减;
比较难实现的是体现k > n 时的情况,用两个变量完成,一个累计每行元素个数,一个表示元素坐标(当然还有k表示行,count表示元素总个数)
#include<stdio.h> #include<stdlib.h> void print(int** a,int n); int main(int args,char* argv[]) { int n; int** a; printf("输入元素个数:\n"); scanf("%d",&n); //构造指针数组 a = (int**)malloc(sizeof(int*) * n); //为指针分配空间 for(int i = 0; i < n; i++) a[i] = (int*)malloc(sizeof(int) * n); printf("蛇形矩阵是:\n); print(a,n); free(a); return 0; }
void print(int **a,int n) { int i,j,k,count = 0; for(k = 1; k <= n; k++) { if(k % 2 == 0) for(i = 0; i < k; i++) { count++; a[i][k-1-i] = count; } if(k % 2 == 1) for(i = 0 ;i < k; i++) { count++; a[k-1-i][i] = count; } } for(; k <= 2 * n - 1 ; k++) { if(k % 2 == 1) for(i = n - 1,j = 1;j <= 2 * n - k ;j++, i--) { count++; a[i][k-1-i] = count; } if(k % 2 == 0) for(i = n - 1,j = 1;j <= 2 * n - k ;j++, i--) { count++; a[k-1-i][i] = count; } } for(i = 0; i < n; i++) { for(j = 0; j < n; j++) printf("%4d",a[i][j]); printf("\n"); } }