题解 | #合唱队#
字符串排序
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;
}