题解 | #合唱队#

字符串排序

http://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584

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


//全是坑
// 给数组A(0-index),B

// 给B排序去重
// 遍历B,对每个值,找A中十进制表示中包含该值的下标,和A中的那个值
// 除此以外还有,还要输出每个值,输出下标的个数,在找不到时不输出,还要输出所有值的总个数
// 所以输出格式是 总数, [B中的值, 下标个数, [A中下标, A中的值,] ]

//去重排序用了插入排序,也可以先排序后去重,先去重后排序 都会简单点
//对得到的新关键字RR遍历  记录output数组
//数字变字符串用strstr 比较时 itoa 在c99不好使用要用
//sprintf(str, "%d", num);
//要点:没限制的数组定义可以适当大一点1000左右没问题
int isclude(int x, int y);
int main()
{
    int ni, nr;
    while (scanf("%d", &ni) != EOF)
    {
        int I[ni];
        for (int i = 0; i < ni; i++)
            scanf("%d", &I[i]);
        scanf("%d", &nr);
        int R[nr];
        for (int i = 0; i < nr; i++)
            scanf("%d", &R[i]);
        //插入排序 去重排序
        int RR[1000] = {0};
        int top = -1;
        int j;    //charudian
        int flag; //是否插入
        RR[++top] = R[0];
        for (int i = 1; i < nr; i++)
        {
            flag = 0;
            j = 0;
            while (j <= top)
            {
                if (R[i] > RR[j])
                    j++;
                else if (R[i] == RR[j])
                {
                    flag = 1;
                    break;
                }
                else
                {
                    break;
                }
            }
            if (flag == 0)
            {
                top++;
                for (int K = top; K > j; K--)
                    RR[K] = RR[K - 1];
                RR[j] = R[i];
            }
        }

        // for (int i = 0; i <= top; i++)
        // {
        //     printf("%d ", RR[i]);
        // }
        //I[ni]   RR[top+1]
        int output[1000];
        int num = 0;
        int count;
        for (int i = 0; i < top + 1; i++)
        {
            output[num] = RR[i];
            count = 0;
            output[++num] = count;
            for (int k = 0; k < ni; k++)
            {
                if (isclude(I[k], RR[i]) == 1)
                {
                    output[++num] = k;
                    output[++num] = I[k];
                    count++;
                }
            }

            if (count == 0)
                num--;
            else
            {
                output[num - 2 * count] = count;
                num++;
            }
        }

        //output[num-1]

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

        
    return 0;
}

// itoa()函数有3个参数:第一个参数是要转换的数字
// 第二个参数是要写入转换结果的目标字符串
// 第三个参数是转移数字时所用 的基数。
int isclude(int x, int y)
{
    int ret = 0;
    char a[100] = {0}, b[100] = {0};
    sprintf(a, "%d", x);
    sprintf(b, "%d", y);
    //     sprintf(a,"%d",x);
    //     sprintf(b,"%d",y);
    if (strstr(a, b) != NULL)
        ret = 1;
    return ret;
}
全部评论

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务