题解 | #数据分类处理#

数据分类处理

https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd

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

// 比较函数,用于 qsort
int compare(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}

// 判断数字 i 是否连续包含数字 j
int contains(int i, int j) { // 比如I是123,R是0
    if (i < j) return 0; // 如果123 < 0, 证明没有包含关系
    int tempI = i;
    int tempJ = j;
    if (tempJ == 0) {
        while (tempI / 10 != 0) {
            if (tempI % 10 == 0) return 1;
            else tempI /= 10;
        }
        return 0;
    } else {
        while (tempJ > 0 && tempI > 0) {
            if (tempI % 10 == tempJ % 10) {
                // printf("%d contains %d's last digit\n", tempI, tempJ);
                while(tempI % 10 == tempJ % 10){
                    tempI /= 10;
                    tempJ /= 10;
                    if(tempJ == 0) {
                        return 1;
                    }
                    if(tempI % 10 != tempJ % 10){
                        tempJ = j;
                        break;
                    }
                }
                
            } else {
                tempI /= 10;
            }
        }
    }
    return tempJ == 0;
}

int main() {
    int I[101];
    int R[101];
    int numOfI, numOfR;
    scanf("%d", &numOfI);
    for (int i = 0; i < numOfI; i++) {
        scanf("%d", &I[i]);
    }
    //test
    // for (int i = 0; i < numOfI; i++) {
    //     printf("%d\n", I[i]);
    // }
    scanf("%d", &numOfR);
    for (int i = 0; i < numOfR; i++) {
        scanf("%d", &R[i]);
    }
    //test
    // for (int i = 0; i < numOfR; i++) {
    //     printf("%d\n", R[i]);
    // }
    // 使用 qsort 对 R 进行排序
    qsort(R, numOfR, sizeof(int), compare);
    //test
    // for (int i = 0; i < numOfR; i++) {
    //     printf("%d\n", R[i]);
    // }
    // 去重并更新 numOfR
    int newR[numOfR + 1];
    int newNumOfR = 0;
    for (int i = 0; i < numOfR; i++) {
        if (R[i] == R[i + 1]) {
            // 如果后面的数字和这个数字相同,我们需要跳过相同的数字
            newR[newNumOfR++] = R[i];
            while (R[i] == R[i + 1]) { //直到遇到下一个新的数字我们停止
                i++;
            }
        } else {
            newR[newNumOfR++] = R[i];
        }
    }
    numOfR = newNumOfR;
    //test
    // for (int i = 0; i < numOfR; i++) {
    //     printf("%d\n", newR[i]);
    // }


    // 一个是满足条件的I的个数,一个是满足条件的I的索引
    int qualifyI[numOfR];
    int indexOfI[numOfR][100];
    for (int i = 0; i < numOfR; i++) {
        qualifyI[i] = 0;
    }

    int total = 0;
    for (int i = 0; i < numOfR; i++) {
        for (int j = 0; j < numOfI; j++) {
            if (contains(I[j], newR[i])) {
                // printf("find %d contains %d\n", I[j], newR[i]);
                // int foundDuplicate = 0;
                // for (int k = 0; k < qualifyI[i]; k++) {
                //     if (I[indexOfI[i][k]] == I[j]) {
                //         foundDuplicate = 1;
                //         break;
                //     }
                // }
                // if (!foundDuplicate) {
                    indexOfI[i][qualifyI[i]++] = j;
                // }
            }
        }
        if (qualifyI[i] != 0) {
            total += 2 * qualifyI[i] + 2;
        }
    }

    printf("%d ", total);
    for (int i = 0; i < numOfR; i++) {
        if (qualifyI[i] > 0) {
            printf("%d ", newR[i]);
            printf("%d ", qualifyI[i]);
            for (int j = 0; j < qualifyI[i]; j++) {
                printf("%d ", indexOfI[i][j]);
                printf("%d ", I[indexOfI[i][j]]);
            }
        }
    }
    printf("\n");

    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 11:35
程序员小白条:话太多,没实力和学历,差不多回答回答就行了,身份地位不一样
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 11:16
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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