题解 | 数据分类处理

/* 基本思路,因为记录的数据都跟规则相关,所以使用hash思想,将规则所在位置的下标作为hash分类依据 */
/*定义了个三位数组p 第3维代表规则所在下标,即p[i]就是存放符合规则R[i]的数量和数据,二维中的首位放的是规则条数即p[i][0][0]用来存放符合该规则的数量,p[i][1]开始存放符合规则的下标和数据值*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 100
#define STR_LEN 15

int main() {
    long long I[LEN];
    long long R[LEN];
    long long p[LEN][LEN+1][2];
    int numi;
    int numr;
    int relnumr = 0;
    long long tmp;
    int i,j;
    char rstr[STR_LEN];
    char istr[STR_LEN];
    int index;
    int total =0;

    for (int i = 0; i < LEN; i++) {
        I[i] = -1;
        R[i] = -1;
    }

    scanf("%d", &numi);
    for (int i = 0; i < numi; i++) {
        scanf("%lld", &I[i]);
    }

    scanf("%d", &numr);
    for ( i = 0; i < numr; i++) {
        scanf("%lld", &tmp);
        for ( j = 0; j < i; j++) {
            if (tmp == R[j]) {
                break;
            }
        }
        /* 跳过重复数字*/
        if (i != j && i != 0) {
            continue;
        }
        
        R[relnumr] = tmp;
        relnumr++;
    }

    /* 对规则进行排序*/
    for (i = 0; i < relnumr; i++) {
        for(j = i; j < relnumr; j++) {
            if (R[i] > R[j]) {
                tmp = R[i];
                R[i] = R[j];
                R[j] = tmp;
            }
        }
    }

    /* 将符合的数据和数量放入p中 */
    memset(p, 0, sizeof(p));
    for (i = 0; i < relnumr; i++) {
        for (j =0; j < numi; j++) {
            sprintf(istr, "%lld", I[j]);
            sprintf(rstr, "%lld", R[i]);
            if (strstr(istr, rstr)) {
                 index = p[i][0][0] + 1;
                p[i][index][0] = j;
                p[i][index][1] = I[j];
                p[i][0][0]++;
            }
        }
    }

    /* 计算输出数量 */
    for (i = 0; i < relnumr; i++) {
        if (p[i][0][0] > 0) {
            total++; /* 规则 */
            total++; /* 规则条数 */
            total += p[i][0][0] * 2;
        }

    }

    printf("%d ", total);

    for (i = 0; i < relnumr; i++) {
        if (p[i][0][0] > 0) {
            printf("%lld ", R[i]);
            printf("%lld ", p[i][0][0]);
            for (int k = 1; k < p[i][0][0] +1; k++) {
                printf("%lld ", p[i][k][0]);
                printf("%lld ", p[i][k][1]);
            }
        }
    }

    return 0;
}

全部评论

相关推荐

asdasdasda...:19岁,不容易啊可能升个本会好点,现在学历歧视太严重了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 13:05
TMD找工作本来就烦,这东西什么素质啊😡
Beeee0927:hr是超雄了,不过也是有道理的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务