2018携程实习

携程

移动数组里的0

给定一个整型数组,将数组中的所有0移动到末尾,非0项保持顺序不变。(在原始数组上进行操作)

输入

第一行是数组的长度
后续每一行是数组的一条记录

输出

调整后的数组内容

solution:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num, i, j, k;
    int *p;
    int tmp;

    scanf("%d", &num);
    p = (int *)malloc(num*sizeof(int));
    for(i = 0, j = 0, k = num-1; i<num; i++) {
        scanf("%d", &tmp);
        if(tmp != 0) {
            p[j++] = tmp;
        } else {
            p[k--] = tmp;
        }
    }

    for(i = 0; i<num; i++) {
        printf("%d ", p[i]);
    }
    printf("\n");

    return 0;
}

result:

4
0
7
0
2
7 2 0 0

Press any key to continue.

二维数组旋转

题目

给定一个N*N的矩阵,将该矩阵顺时针旋转90度

输入

一个N*N二维数组

输出

将输入的二维数组顺时针旋转90度

solution:

#include <stdio.h>
#include <stdlib.h>

int getline_(char s[],int lim){
    int c,i;
    i=0;
    while((c=getchar())!=EOF&&c!=\'\n\'&&i<lim-1)
        s[i++]=c;
    s[i]=\'\0\';
    return i;
}
int main(int argc, char **argv)
{
    int N = 0;
    int i, j=0, k, i0;
    char p[100];
    int *p1, *p2;

    i = i0 = getline_(p,100);
    for(;i0>=0;i0--) {
        if(p[i0]>=\'0\' && p[i0]<=\'9\') {
            N++;
        }
    }
    p1 = (int *)malloc(N*N*sizeof(int));
    p2 = (int *)malloc(N*N*sizeof(int));

    for(j = 0,k = 0;k<i;k++) {
        if(p[k]>=\'0\' && p[k]<=\'9\') {
            p1[j++] = (int)p[k]-\'0\';            
        }
    }

    for(i = N; i<N*N; i++) {
        scanf("%d", p1+i);
    }

    for(i = 0; i<N*N; i++) {
        //顺时针旋转90度:p[i][j]=p[j][N-1-i] ,i从0开始
        p2[i%N*N+N-1-i/N] = p1[i];
    }
    for(i = 0; i<N*N; i++) {
        if(i%N == 0){
            printf("\n");
        }
        printf("%d ", p2[i]);
    }

    return 0;

}

result:

1 4 7
2 5 8
3 6 9

3 2 1
6 5 4
9 8 7
Press any key to continue.

搜索符合用户需求且价格最低的房型