首页 > 试题广场 >

数据分类处理

[编程题]数据分类处理
  • 热度指数:163308 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。

采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。

数据范围: ,输入的整数大小满足

输入描述:

一组输入整数序列I和一组规则整数序列RIR序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~(2^31)-1,序列个数不限



输出描述:

R依次中取出R<i>,对I进行处理,找到满足条件的I 

I整数对应的数字需要连续包含R<i>对应的数字。比如R<i>23I231,那么I包含了R<i>,条件满足 。 

R<i>从小到大的顺序:

(1)先输出R<i> 

(2)再输出满足条件的I的个数; 

(3)然后输出满足条件的II序列中的位置索引(0开始) 

(4)最后再输出I 

附加条件: 

(1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I,索引大的需要过滤掉 

(2)如果没有满足条件的I,对应的R<i>不用输出 

(3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)

 

序列I15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数) 

序列R5,6,3,6,3,0(第一个5表明后续有5个整数) 

输出:30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786

说明:

30----后续有30整数

3----从小到大排序,第一个R<i>0,但没有满足条件的I,不输出0,而下一个R<i>3

6--- 存在6个包含3I 

0--- 123所在的原序号为0 

123--- 123包含3,满足条件 

示例1

输入

15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
5 6 3 6 3 0

输出

30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786

说明

将序列R:5,6,3,6,3,0(第一个5表明后续有5个整数)排序去重后,可得0,3,6。
序列I没有包含0的元素。
序列I中包含3的元素有:I[0]的值为123、I[3]的值为453、I[7]的值为3、I[9]的值为453456、I[13]的值为453、I[14]的值为123。
序列I中包含6的元素有:I[1]的值为456、I[2]的值为786、I[4]的值为46、I[8]的值为665、I[9]的值为453456、I[11]的值为456、I[12]的值为786。
最后按题目要求的格式进行输出即可。     
#include<stdio.h>
#
include<stdlib.h>
#include<string.h>

typedef struct res_data{
unsigned int index;
unsigned int data;
struct res_data * next;
}res_data_t;

int checkReg(res_data_t ** R , unsigned int I_num , unsigned int * I_data , unsigned int R_data)
{
int res =0;
res_data_t * pRes;
res_data_t * record_data = NULL;
record_data = (res_data_t *)malloc(sizeof(res_data_t));
memset(record_data,0,sizeof(res_data_t));
*R = record_data;
pRes=record_data;
char dest[20]={};
char targ[20]={};
for(unsigned int i=0;i<I_num;++i)
{
sprintf(dest,"%u",I_data[i]);
sprintf(targ,"%u",R_data);
if(strstr(dest,targ))
{
++res;
record_data = (res_data_t *)malloc(sizeof(res_data_t));
memset(record_data,0,sizeof(res_data_t));
record_data->index=i;
record_data->data=I_data[i];
pRes->next=record_data;
pRes=record_data;;
}
}
(*R)->index = res;
if(res)
(*R)->data = res*2+1+1;
return res;
}

int main()
{
unsigned int I_num=0;
unsigned int * I_data=NULL;
unsigned int R_num=0;
unsigned int * R_data=NULL;

while(~scanf("%d",&I_num))
{
unsigned char * origin_index=NULL;
int total_res=0;
res_data_t   ** R=NULL;
I_data = (unsigned int *)malloc(sizeof(unsigned int)*I_num);
for(int i=0; i<I_num; ++i)
scanf("%d",I_data+i);

scanf("%d",&R_num);
R = (res_data_t **)malloc(sizeof(res_data_t *)*R_num);
memset(R,0,sizeof(res_data_t *)*R_num);
R_data = (unsigned int *)malloc(sizeof(unsigned int)*R_num);
origin_index = (unsigned char *)malloc(sizeof(unsigned char)*R_num);
for(int i=0; i<R_num; ++i)
{
scanf("%d",R_data+i);
origin_index[i]=i;
}
for(int i=0; i<R_num; ++i)
for(int j=i+1;j<R_num;++j)
if(R_data[i]>R_data[j])
{
int temp=R_data[i];
R_data[i]=R_data[j];
R_data[j]=temp;
temp=origin_index[i];
}
for(int i=0; i<R_num; ++i)
{
if(i>0 && R_data[i]==R_data[i-1])
continue;
checkReg(&R[i] , I_num , I_data , R_data[i]);
total_res+=R[i]->data;
}

printf("%d ",total_res);
for(int i=0; i<R_num; ++i)
{
if(i>0 && R_data[i]==R_data[i-1])
continue;
if(R[i]->next != NULL)
{
res_data_t * data=NULL;
printf("%d ",R_data[i]);
printf("%d ",R[i]->index);
data = R[i]->next;
free(R[i]);
while(data!=NULL)
{
printf("%d %d ",data->index, data->data);
res_data_t * pFree=data;
data = data->next;
free(pFree);
}
}
}
printf("\n");
}
free(I_data);
free(R_data);
return 0;
}
编辑于 2020-03-01 00:33:17 回复(1)
const line1 = readline().split(' ') //获取第一行输入的值并转为数组
const line2 = readline().split(' ') //获取第二行输入的值并转为数组
line1.shift() //分别去除第一个和第二个数组第一项
line2.shift()
const IArr = [...line1] //处理生成要对比的数组
const RArr = [...new Set(line2)].sort((a,b)=>a-b) //去重并排序
let res = [] //存储结果的数组
RArr.forEach(item=>{ //遍历数组I和R,查找数组I中的某项字符串是否包含数组R中的某项字符串
    let flag = false  //标志是否查到,查不到则不输出0
    let hasArr = [] //存储从I中查找到的索引和值
    let hasArrLen = 0 //存储查找到的数据数量
    IArr.forEach((item1,index1)=>{
        if( item1.indexOf(item) !== -1){
            flag = true
            hasArrLen++
            hasArr.push(index1,item1)
        }
    })
    if(flag){
        res.push(item,hasArrLen,...hasArr)
    }
})
console.log(res.length,...res)

发表于 2022-07-05 14:36:32 回复(0)
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

bool IsHave(string str1, string str)
{
	if (str.find(str1) == str.npos) // 没有时返回的是 npos。下标
	{
		return false;
	}
	return true;
}

int main()
{
	vector<string>vecI;  // 主序列
	vector<int>vecR_i;  // 子序列
	int m = 0, n = 0, R_i = 0;
	while (cin >> m)
	{
		string str;
		for (int i = 0; i < m; ++i)
		{
			cin >> str;
			vecI.push_back(str);
		}
		cin >> n;
		for (int i = 0; i < n; ++i)
		{
			cin >> R_i;
			vecR_i.push_back(R_i);
		}
	}

	sort(vecR_i.begin(), vecR_i.end()); // 对子序列进行排序
	vecR_i.erase(unique(vecR_i.begin(), vecR_i.end()), vecR_i.end()); // 快排之后,去除相同元素.
	vector<string>vec;
	vector<int>num;
	int N = 0, M = 0;


	bool flag = false;
	for (int j = 0; j < vecR_i.size(); ++j)  // 子序列
	{
		vec.push_back(to_string(vecR_i[j])); // 推入
		for (int i = 0; i < vecI.size(); ++i)  //主序列
		{
			if (IsHave(to_string(vecR_i[j]), vecI[i]))
			{
				string s = to_string(i);
				vec.push_back(s);  // 保存下标
				vec.push_back(vecI[i]); // 保存对应字符串
				flag = true;  // 为true代表的是该子序列在主序列中有值,vec更新
				N++;  // 保存主序列中有几个数包含子序列的值
			}
		}
		if(N != 0)
			num.push_back(N);  // 更新子序列的数值

		if (!flag)  // vec未更新,推出最后一个元素
			vec.pop_back();
		else
		{
			flag = false;
			N = 0;

		}
	}
	vector<int>num1;  // 记录
	int a = 0;
	for (int i = 0; i < num.size(); ++i)
	{
		a  += num[i];
		num1.push_back(a);
	}
	vec.insert(vec.begin() + 1, to_string(num[0]));
	for (int i = 1; i < num.size(); i++)
	{
		vec.insert(vec.begin() + 2 * num1[i - 1] +  2 * i +  1, to_string(num[i])); // 更新vec,合并vector,插入对应数值
	}
	cout << vec.size() << " ";
	for (int i = 0; i < vec.size(); ++i)
	{
		cout << vec[i] << " ";
	}
	return 0;
}

发表于 2022-04-05 13:50:17 回复(0)
I = input()
R = input()
i = I.split(' ')[1:]
r = list(set(map(int,R.split(' ')[1:])))
r.sort()
count = 0 
i_out_list = []
i_out_index_list = []
r_out_list = []
count_out_list = []
for item in r:
    item_list = []
    item_index_list = []
    count_tmp = 0
    for q,j in enumerate(i):
        item = str(item)
        if item in j:
            count_tmp += 1
            item_list.append(j)
            item_index_list.append(q)
    if count_tmp == 0:
        continue
    count += (2+count_tmp*2)
    i_out_list.append(item_list)
    i_out_index_list.append(item_index_list)
    r_out_list.append(item)
    count_out_list.append(count_tmp)
print(count,end=' ')
for k,temp in enumerate(r_out_list):
    print(temp,end=' ')
    print(count_out_list[k],end=' ')
    for w,m in zip(i_out_index_list[k],i_out_list[k]):
        print(str(w)+' '+m,end=' ')
# 自测能过,但不能通过,估计是超过时间限制了。这题目太复杂,调了一个多小时,没意思
发表于 2021-10-24 16:17:10 回复(0)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author Yuliang.Lee
 * @version 1.0
 * @date 2021/9/3 11:41
 * 数据分类处理:
    https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd?tpId=37&&tqId=21248&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

 * 数据结构定义:
    输入: 一个TreeSet<Integer>、String[]
    输出:一个结果List<Object>、一个临时List<Object>
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            // 初始化输入数据
            int numL = in.nextInt();
            String[] arrayL = new String[numL];
            for (int i = 0; i < numL; i++) {
                arrayL[i] = in.next();
            }
            int numR = in.nextInt();
            Set<Integer> setR = new TreeSet<>();
            for (int i = 0; i < numR; i++) {
                setR.add(in.nextInt());
            }

            // 定义输出数据结构
            List<Object> tmpList = new ArrayList<>();
            List<Object> resultList = new ArrayList<>();

            // 数据分类处理
            for (Integer e : setR) {
                String str = String.valueOf(e);
                for (int i = 0; i < numL; i++) {
                    if (arrayL[i].contains(str)) {
                        tmpList.add(i);
                        tmpList.add(arrayL[i]);
                    }
                }
                if (tmpList.size() > 0) {
                    resultList.add(e);
                    resultList.add(tmpList.size() / 2);
                    resultList.addAll(tmpList);
                    tmpList.clear();
                }
            }

            // 结果输出
            System.out.print(resultList.size() + " ");
            for (Object o : resultList) {
                System.out.print(o + " ");
            }
            System.out.println();
        }
    }
}

发表于 2021-09-03 13:31:35 回复(0)
这个人太笨了,写了百多行………………
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int GetIntsNum(int num)
{
    if(num == 0) return 1;
    int count = 0; //计数器
    while (num != 0) //当不是0就循环
    {
        count++;  //计数器加1
        num = num / 10; //去掉个位赋值给自己
    }
    return count;
}

bool isConclude(int a, int b)  //a是否包含b
{
    int b_num = GetIntsNum(b);
    int modnum = 1;
    while(b_num > 0)
    {
        modnum *= 10;
        b_num--;
    }
    while(a > 0)
    {
        int tmp = a % modnum;
        if(tmp == b)
            return true;
        a /= 10;
    }
    return false;
}

vector<int> ClassifyProcess(vector<int> R, vector<int> I)
{
    int i_size = I.size();
    int r_size = R.size();
    int pre;
    vector<int> res;
    vector<int> vec;
    for(int & i : I)
    {
        vector<int> tmp;
        int flag = 1;
        if(pre != i)
        {
            pre = i;
            for(int r = 0; r < r_size; ++r)
            {
                if(isConclude(R[r], i))
                {
                    if(flag)
                    {
                        vec.push_back(i);
                        flag = 0;
                    }
                    tmp.push_back(r);
                    tmp.push_back(R[r]);
                }
            }
            if(tmp.size() > 0)
            {
                vec.push_back(tmp.size() / 2);
                for(int & p : tmp)
                {
                    vec.emplace_back(p);
                }
            }

        }
    }
    res.push_back(vec.size());
    for(int & p : vec)
    {
        res.emplace_back(p);
    }
    return res;
}

int main()
{
    int r_num;
    while(scanf("%d", &r_num) != EOF)
    {
        vector<int> R(r_num);
        for(int & a : R)
        {
            scanf("%d", &a);
        }
        int i_num;
        scanf("%d", &i_num);
        vector<int> I(i_num);
        for(int & a : I)
        {
            scanf("%d", &a);
        }
        sort(I.begin(), I.end());

        vector<int> ans = ClassifyProcess(R, I);

        for(int & p : ans)
        {
            cout<<p<<" ";
        }
        cout<<endl;
    }
    return 0;
}


发表于 2021-08-30 16:20:50 回复(0)
这个题目如果把思路理清了就不难,主要是处理起来比较麻烦。我的思路是先用2个vector<int>存输入(即题目中的I和R序列),v2排序去重之后,将v1、v2转换成vector<string>,方便查找子串。然后初始化一个长度为v2.size()的数组nums,用来存每个v2元素在v1中对应满足条件的个数;初始化一个v2.size()*v1.size()的二维数组array,用来存v1中满足条件的元素下标。这样对每个v2中的元素v2[i],在v1中对应元素的个数为nums[i],下标遍历array[i]就能得到。
上述方法还可省一点空间,就是不要nums,因为nums[i]的值就是array[i].size()的值。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

string itoa(int n){
    string ans="";
    if(n==0)    return "0";
    while(n){
        ans+=n%10+'0';
        n/=10;
    }
    reverse(ans.begin(), ans.end());
    return ans;
}

int main(){
    int n1,n2;
    long long n;
    while(cin>>n1){
        vector<long long> v1,v2;
        vector<string> s1,s2;
        for(int i=0;i<n1;i++){
            cin>>n;
            v1.push_back(n);
        }
        cin>>n2;
        for(int i=0;i<n2;i++){
            cin>>n;
            v2.push_back(n);
        }
        sort(v2.begin(),v2.end());
        v2.erase(unique(v2.begin(),v2.end()), v2.end());

        vector<int> nums(v2.size(),0);//存v2中每个元素在v1中满足条件的个数
        vector<vector<int>> array(v2.size());//v1中满足条件的元素对应的位置
        //转换成字符串处理
        for(int i=0;i<n1;i++){
            s1.push_back(itoa(v1[i]));
        }
        for(int i=0;i<v2.size();i++){
            s2.push_back(itoa(v2[i]));
        }
        string::size_type pos;
        for(int i=0;i<v2.size();i++){
            for(int j=0;j<n1;j++){
                pos = s1[j].find(s2[i]);
                if(pos!=string::npos){
                    nums[i]++;
                    array[i].push_back(j);
                }
            }
        }

        //打印输出
        int res=0;
        for(int i=0;i<v2.size();i++){
            if(array[i].size()!=0){
                res+=2+2*array[i].size();
            }
        }
        cout<<res;
        for(int i=0;i<v2.size();i++){
            if(array[i].size()!=0){
                cout<<' '<<v2[i]<<' '<<array[i].size();
                for(int j=0;j<array[i].size();j++){
                    cout<<' '<<array[i][j]<<' '<<v1[array[i][j]];
                }
            }
        }
        cout<<endl;
    }
    
    return 0;
}


发表于 2021-08-07 18:31:29 回复(0)
a=input().split()[1:]
b=map(int,input().split()[1:])
b=sorted(set(b))
res=[]
for i in b:
    count =0
    x=[]
    for j in range(0,len(a)):
        if str(i) in a[j]:
            count +=1
            x.append(str(j))
            x.append(a[j])
    if count!=0:
        res.append(str(i))
        res.append(str(count))
        res.extend(x)
res.insert(0, str(len(res)))
print(' '.join(res))
发表于 2021-05-11 21:49:28 回复(0)
暴力法,对去重排序后的R直接遍历,然后检查在I序列中的出现情况并按题意记录即可
while True:
    try:
        I = input().strip().split()[1:]
        R = sorted(list(set(list(map(int, input().strip().split()[1:])))))
        res = ""
        n = 0        # 最终序列总长度
        for r in R:
            temp = ""
            count = 0        # 有多少个I包含r
            for i in range(len(I)):
                if str(r) in I[i]:
                    temp += f"{i} {I[i]} "       # 记录位置和对应的I值
                    n += 2
                    count += 1
            if count:
                temp = f"{r} {count} " + temp    # 记录R值及其计数
                n += 2
            res += temp
        print(f"{n} {res}".rstrip())
    except:
        break

发表于 2021-03-29 17:04:04 回复(0)
while True:
    try:
        I = input().strip().split(' ')[1:]
        R = input().strip().split(' ')[1:]  # R=['6','3','6','3','0']
        # 此处排序一定要注意是将字符对应的整型数排序,而不是单纯靠字符排序,
        # 避免出现'4'比'26'大的情况
        R = sorted(set(R), key=int)  # R = ['0','3','6']
        rm = []  # R列表中应该移除的值
        for R_i in R:
            flag = 0  # 对于R中的某个元素R_i,假设列表I中的每个元素都不包含R_i
            for I_i in I:
                if R_i in I_i:
                    flag = 1
            if flag == 0:  # 说明R_i应该从R中移除
                rm.append(R_i)
        for rm_i in rm:
            R.remove(rm_i)

        # 至此,列表R已经处理完毕,可以开始与I的匹配运算,R = ['3','6']
        L = []
        for R_i in R:
            L.append(R_i)
            count = 0
            index_value = []
            # 此处一定不能直接迭代I中的元素,即for I_i in I,因为循环
            # 内部需要使用到列表元素的角标,若元素ele出现多次,靠方法
            # L.index(ele)只能返回ele第一次出现时的角标,而不是ele在
            # 列表L中的实际角标位置。
            for index in range(len(I)):
                if R_i in I[index]:
                    count += 1
                    index_value.extend([str(index), I[index]])
            L.append(str(count))
            L.extend(index_value)
        # 至此,3和6的相关输出已经全部在列表L中
        L_len = str(len(L))
        L.insert(0, L_len)
        print(' '.join(L))
    except:
        break

发表于 2020-12-02 10:50:18 回复(0)
当我正序输出全部字符串时:
print(output.rstrip())
答案如下:

当我倒序输出全部字符时,
print(output.rstrip()[::-1])
答案如下:

这是什么原因?根据倒叙输出,可以推测出我的答案是正确的,但是只要一正序输出,就变成空了。着什么情况?牛客网有什么毛病?

编辑于 2020-09-14 12:13:32 回复(1)
Python 运行时间:16ms,附注释
def find(Rx, I):
    Rx = str(Rx)
    count = 0
    resLst = []
    for i in range(len(I)): # 遍历I中元素
        if Rx in I[i]:
            count += 1
            resLst.append(i) # 满足条件的I<j>在I序列中的位置索引
            resLst.append(I[i]) # 满足条件的I<j>的元素
    if count != 0:
        return Rx, count, resLst
    else:
        return '', '', ''

while True:
    try:
        II = input().split()
        lenI = int(II[0]) # 序列I的长度
        I = II[1:] # 序列I的元素,元素为字符串形式
        RR = list(map(int, input().split()))
        lenR = RR[0]
        R = sorted(set(RR[1:]), reverse=False) # 去重,排序
        # 从R依次中取出R<i>,对I进行处理,找到满足条件的I<j>
        resRi = [] # 满足条件的R<i>
        resCount = [] # 满足条件的I<j>的个数
        resIndexContent = [] # 满足条件的I<j>在I序列中的位置索引(从0开始) 与 满足条件的I<j>的元素
        num = 0
        for Rx in R:
            rx, count, resLst = find(Rx, I)
            if rx: # 如果rx非空
                resRi.append(rx)
                resCount.append(count)
                resIndexContent.append(resLst)
                num += (1 + 1 + len(resLst))
        RES = str(num)
        for i in range(len(resRi)):
            RES = RES + ' ' + str(resRi[i]) + ' ' + str(resCount[i]) + ' ' + (' '.join(str(ii) for ii in resIndexContent[i]))
        print(RES)
    except:
        break


编辑于 2020-08-26 17:24:16 回复(0)
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

// 判断是否是子串
bool isSubStr(string sSub, int Str)
{
    string sStr = to_string(Str);
    return sStr.find(sSub) != string::npos;
}

// 判断序列I中的元素i是否包含的子串sub,并返回下标和值
vector<int> getSubstr(int sub, vector<int> I)
{
    vector<int> result;
    int is = I.size();
    for (int pos = 0; pos < is; pos++)
    {
        string sSub = to_string(sub);
        int i = I[pos];
        if(isSubStr(sSub, i))
        {
            result.push_back(pos);
            result.push_back(i);
        }
    }

    return result;
}

// 获取序列I中所有满足规则序列R的元素下标、数值,以及个数
vector<int> dataClassify(vector<int> I, vector<int> R)
{
    vector<int> Result;
    // 遍历R,对R中的每一个规则整数r,遍历序列I,获取满足的数据
    for (vector<int>::iterator ri = R.begin(); ri != R.end(); ri++)
    {
        int r = *ri;
        vector<int> sv = getSubstr(r, I);
        int ss = sv.size();

        if (ss > 0)
        {
            Result.push_back(r);
            Result.push_back(ss/2);
            Result.insert(Result.end(), sv.begin(), sv.end());
        }
    }

    return Result;
}

int main()
{
    // 循环处理
    int in,rn;
    while(cin>>in)
    {
        // 读取输入数据序列I和R;
        vector<int> I, R;
        int temp;
        for (size_t i = 0; i < in; i++)
        {
            cin>>temp;
            I.push_back(temp);
        }
        cin>>rn;
        for (size_t i = 0; i < rn; i++)
        {
            cin>>temp;
            R.push_back(temp);
        }

        // 排序和去重序列R;
        sort(R.begin(), R.end());
        R.erase(unique(R.begin(), R.end()), R.end());

        // 对数据进行分类
        vector<int> Result = dataClassify(I, R);
        
        // 输出结果
        cout<< Result.size() << " ";
        for (vector<int>::iterator Ri = Result.begin(); Ri != Result.end(); Ri++)
        {
            cout << *Ri << " ";
        }
        cout << endl;
    }

    return 0;
}

发表于 2020-07-27 00:12:55 回复(0)
#include <iostream>
#include <algorithm>
#include <vector>
//将结果放到2个 vector中,num 中放 序列数字I 和 该数字在R序列中出现的次数
//res 中放 具体的 索引和 对应的数字
//代码中定义的I和R与题目说明的I和R相反
using namespace std;

int main()
{
    int m,n;
    while(cin>>m)
    {
        vector<int> R;
        for(int i = 0;i<m;i++)
        {
            int tmp;
            cin>>tmp;
            R.push_back(tmp);
        }
        cin>>n;
        vector<int> I;
        for(int i = 0;i<n;i++)
        {
            int tmp;
            cin>>tmp;
            I.push_back(tmp);
        }
        sort(I.begin(),I.end());//排序序列I
        vector<int> res,num;
        for(int i = 0;i<n;i++)
        {
            if(i !=0  && I[i] == I[i-1])    continue;//对I去重
            int count = 0,flag = 0;
            for(int j = 0;j<m;j++)
            {
                int tmp = R[j];
                while(tmp)
                {
                    if(tmp%10 == I[i] || tmp%100 == I[i] || tmp%1000 == I[i])//判断I中的数字是否在R中
                    {
                        if(flag == 0)//第一次找到对应的数字
                        {
                            flag = 1;
                            count++;
                            num.push_back(I[i]);//把I中具体的数字加入num
                            res.push_back(j);//把具体的索引加入res
                            res.push_back(R[j]);//把具体的数字加入res
                        }
                        else
                        {
                            count++;
                            res.push_back(j);
                            res.push_back(R[j]);
                        }
                        break;
                    }
                    tmp/=10;
                }
            }
            if(count != 0) // 如果I中对应的数字在R中可以找到,则在num中加入count
                 num.push_back(count);
        }
        
        int start = 0,j;
        cout<<num.size()+res.size()<<" ";//输出num和res的和,即输出总数
        for(int i = 0;i<num.size();i++)
        {
            cout<<num[i]<<" "<<num[++i]<<" ";
            for(j = start;j<start+num[i]*2;j++)//因为是要输出索引和对应的数字,因此此处是num[i]*2
            {
                cout<<res[j]<<" ";
            }
            start = j;
        }
        cout<<endl;
    }
    return 0;
}

发表于 2020-07-15 10:30:01 回复(1)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            //输入I<j>
            int n = sc.nextInt();
            int[] num = new int[n];
            for(int i=0; i<n; ++i){
                num[i] = sc.nextInt();
            }
            //输入R<i>:使用TreeSet去重并排序
            int m = sc.nextInt();
            Set<Integer> rule = new TreeSet<>();
            for(int i=0; i<m; ++i){
               rule.add(sc.nextInt());
            }
            
            int total = 0;//记录后续整数序列的个数
            StringBuffer res = new StringBuffer();//记录将要输出的字符串
            
            //遍历R<i>
            for(Integer r:rule){
                int count = 0; //存储包含R<i>的I<j>元素的个数
                ArrayList<Integer> arr = new ArrayList<>();//存储包含R<i>的I<j>元素的原序号
                //遍历I<j>
                for(int i=0; i<n; ++i){
                    String tmp = num[i]+"";
                    if(tmp.contains(r.toString())){
                        count++;
                        arr.add(i);
                    }
                }
                //如果没有满足条件的I<j>,对应的R<i>不用输出 
                if(count!=0){
                    total += 2*count + 2;
                    res.append(r+" "+count+" ");
                    for(int i:arr){
                        res.append(i+" "+num[i]+" ");
                    }
                }
            }
            //在输出序列的第一个整数位置记录total,并去掉输出末尾的空格
            res.insert(0, total+" ").deleteCharAt(res.length()-1);
            System.out.println(res);
            
        }
        sc.close();
    }
}

编辑于 2020-07-14 05:56:44 回复(0)
while True:
    try:
        I=list(input().split(' '))
        R=list(map(int,input().split(' ')))        
        Rs=list(set(R[1:]))
        I=I[1:]
        Rs.sort()
        
        Rs=[str(i) for i in Rs]
        string=[]
        for i in range(len(Rs)):
            temp=[];count=0
            for j in range(len(I)):
                if Rs[i] in I[j]: 
                    temp.append(j)
                    temp.append(I[j])
                    count=count+1
            if count!=0:
                string.append(Rs[i])
                string.append(count)
                string=string+temp        
        num=[len(string)]
        num=num+string
        out=' '.join(map(str,num))
        print(out)
    except:
        break
求大神们帮忙看一下,样例能通过,但是保存调试的时候不通过,提示“空.请检查一下你的代码,有没有循环输入处理多个case”,但是我用了 while True: try: except:break 模块呀,并且我把不通过的样例单独调试是可以通过的,问题出在哪里啊?
发表于 2020-05-18 17:50:39 回复(1)
# 数组去重
def remove_same(l):
    new_l=[]
    for i in l:
        if i not in new_l:
            new_l.append(i)
    return new_l

(1294)# 判断一个字符串(s)在一个字符串的list(l)中出现次数
def is_appear_in_list(s,l):
    count=0
    l_tmp=[]
    for i in range(len(l)):
        if str(s) in str(l[i]):
            count+=1
            l_tmp.append(i)
            l_tmp.append(l[i])
    return count,l_tmp#出现次数,[j,I[j]...]

while True:
    try:
        I_tmp=input().split()
        I_num=I_tmp.pop(0)(1295)#15
        I=[int(v) for v in I_tmp]#[123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123]
        R_tmp=input().split()
        R_num=R_tmp.pop(0)(1296)#5
        R=sorted(remove_same([int(v) for v in R_tmp]))#[0,3,6]
        ans=[]
        for r in R:
            count,l_tmp=is_appear_in_list(r,I)
            if count>0:
                ans.append(r)(1297)#3
                ans.append(count)#6
                ans+=l_tmp
        length=len(ans)
        ans.insert(0,length)
        for i in range(len(ans)):
            if i ==len(ans)-1:
                print(ans[i])
            else:
                print(ans[i],end=" ")
    except:
        break
这题的题干看的真是让人恶心。。。但是仔细看还是能看明白的,直接看说明会直观一些。
发表于 2020-03-03 22:33:23 回复(0)
#include <stdio.h>
#
include <string.h>
#include <stdlib.h>

#
define MAX_LEN (1<<12)

unsigned long I[MAX_LEN];
unsigned long R[MAX_LEN];
unsigned long result[MAX_LEN];
int total_cnt;
int g_index = 1;

void  do_one_r_rule(unsigned long rule, int i_num)
{
    char rule_str[32];
    char i_str[32];
    int i, cnt=0;
    int curr_index = g_index+2;
    
    sprintf(rule_str, "%lu", rule);
    for (i = 0; i < i_num; i++) {
        sprintf(i_str, "%lu", I[i]);
        if (strstr(i_str, rule_str) != NULL) {
            cnt++;
            result[curr_index] = i;
            result[++curr_index] = I[i];
            curr_index++;
        }
    }
    if (cnt != 0) {
        result[g_index] = rule;
        result[++g_index] = cnt;
        g_index += 2*cnt+1;
        total_cnt += 2*cnt+2;
    }
}

int main(void)
{
    int i_num, r_num;
    int i,j,k;
    int pos;
    unsigned long temp;
    
    while (scanf("%d", &i_num) >= 0) {
        g_index =1;
        total_cnt =0;
        
        for (i = 0; i < i_num; i++)
            scanf("%lu", &I[i]);
        
        scanf("%d", &r_num);
        for (i = 0,pos = 0; i < r_num; i++,pos++) {
            scanf("%lu", &R[pos]);
            for (j = 0; j < pos; j++)
                if (R[pos] <= R[j])
                    break;
            
            if (j >= pos)
                continue;
            if (R[pos] == R[j]) {
                pos--;
                continue;
            }
            
            temp = R[pos];
             for (k = pos-1; k >= j; k--) {
                R[k+1] = R[k];
            }
            R[j] = temp;
        }
        
        for (i = 0; i < pos; i++)
            do_one_r_rule(R[i], i_num);
        
        if (total_cnt != 0) {
            printf("%lu ", total_cnt);
            for (i = 0; i < total_cnt; i++)
                printf("%lu ", result[i+1]);
            
            printf("\n");
        }
    }
    return 0;
}
发表于 2020-02-25 22:48:54 回复(0)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct{
    int number;        //R在I<>中有对应数字的个数
    int index[50];     //R在I中对对应数字的下标
}data;

char* Int2Str(int num,char *str){  //将数字转化为字符串,反序,这里不影响
    int i = 0,j=0;
    do{
        str[i++] = num%10+48; //0的ASCII码为48
        num /= 10;
    }while(num); 
    str[i] = '\0'; 
    return str;
}

int main(){
    int Inum;
    while(scanf("%d",&Inum)!=EOF){
        int i,j,k,I[1000],Rnum,R[500],temp,q,talnum=0;
        char aI[10],aR[10];//存储字符串
		data *Rinfo[500]={NULL};
        for(i=0;i<Inum;i++) scanf("%d",&I[i]);//输入I
        scanf("%d",&Rnum);
        for(i=0;i<Rnum;i++) scanf("%d",&R[i]);//输入R
        for(i=0;i<Rnum-1;i++)
            for(j=0;j<Rnum-1-i;j++){
                if(R[j]>R[j+1]){
                    temp=R[j];
                    R[j]=R[j+1];
                    R[j+1]=temp;
                }
                else if(R[j]==R[j+1]){
                    for(k=j;k<Rnum;k++)
                        R[k]=R[k+1];
                    j--;
                    Rnum--;
                }
            }                     //R中的数据已排序好并删除了重复的数
        for(i=0;i<Rnum;i++){
            q=0;
            for(j=0;j<Inum;j++){
                if(strstr(Int2Str(I[j],aI),Int2Str(R[i],aR))){//R[i]是I[j]的子串
                    if(!Rinfo[i]){
                    Rinfo[i]=(data*)malloc(sizeof(data));
                        memset(Rinfo[i],0,sizeof(data));
                    }
                    Rinfo[i]->number++;
                    Rinfo[i]->index[q++]=j;
				}
            }
        }                                         //获取完数据
        for(i=0;i<Rnum;i++)
            if(Rinfo[i])
                talnum+=2+2*Rinfo[i]->number;
        printf("%d ",talnum);             //共有多少个数字
        for(i=0;i<Rnum;i++){
            if(Rinfo[i]){
                printf("%d %d ",R[i],Rinfo[i]->number);//输出R和个数
                for(j=0;j<Rinfo[i]->number;j++)
                    printf("%d %d ",Rinfo[i]->index[j],I[Rinfo[i]->index[j]]);//下标和I
            }
        }
        printf("\n");
    }
    return 0;
}

发表于 2020-02-16 14:42:09 回复(0)
来一个超级复杂的,纯C



#include<stdio.h>
#include<string.h>
typedef struct {
    int index;
    int num;
    unsigned long int I_st;
}stOut;

int atoi_my(unsigned long int x, char *out)
{
    int i = 0;
    unsigned long int in = x;
    while (in/10 !=0) {
        out[i] = in%10 + '0';
        in = in/10;
        ++i;
    }
    out[i] = in%10 + '0';
    out[i + 1] = '\0';
}

int main()
{
    char I_list[1024][32]={};
    char R_list[1024][32]={};
    unsigned long int I_list_i[1024];
    unsigned long int R_list_i[1024];
    char base_I[32];
    char base_R[32];
    
    //while(scanf("%d",&I_num) != EOF) {
   // int l = 2;
   // while(l)
    //{
    //    l--;
    int I_num = 0;
    int R_num = 0;
    while(scanf("%d",&I_num) != EOF) {
    //{
    int q = 0;
    stOut last_out[1024][64] = {0};
    //scanf("%d",&I_num);
    for (int i = 0; i < I_num; ++i) {
        scanf("%d",&I_list_i[i]);
    }
    
    scanf("%d",&R_num);
    for (int i = 0; i< R_num; ++i) {
        scanf("%d",&R_list_i[i]);
    }
    
    unsigned long int real_R_list_i[1024];
    for (int i = 0; i < R_num; ++i) {
        unsigned long int base = R_list_i[i];
        for ( int j = i + 1; j < R_num; ++j ) {
            if (base > R_list_i[j]) {
                R_list_i[i] = R_list_i[j];
                R_list_i[j] = base;
                base = R_list_i[i];
            }
        }
        //printf("%d-",base);
    }
    int k = 0;
    for (int i = 0; i < R_num; ++i) {
        int flag = 0;
        for ( int j = i + 1; j < R_num; ++j ) {
            if (R_list_i[j] == R_list_i[i]) {
                flag = 1;
            }
        }
        if (flag == 0) {
            real_R_list_i[k] = R_list_i[i];
            k++;
        }
    }
    /*for (int i = 0; i < k; ++i) {
        printf("%d-",real_R_list_i[i]);
    }*/
    for (int i = 0; i < k; ++i) {
        atoi_my(real_R_list_i[i], base_R);
        strcpy(R_list[i], base_R);
    }
        //printf("%d-",I_num);
    for (int i = 0; i < I_num; ++i) {
        atoi_my(I_list_i[i], base_I);
        strcpy(I_list[i], base_I);
    }
        //printf("%d-",I_num);
    for (int i = 0; i < k; ++i) {
        int m = 0;
        atoi_my(real_R_list_i[i], base_R);
        for (int j = 0; j < I_num; ++j) {
            atoi_my(I_list_i[j], base_I);
            for (int n = 0; n < strlen(base_I) - strlen(base_R) + 1; ++n) {
                if (strncmp(base_I + n,base_R,strlen(base_R)) == 0) {
                    last_out[i][m].index = j;
                    last_out[i][m].I_st = I_list_i[j];
                    m++;
                    break;
                }
            }
        }
        last_out[i][0].num = m;
    }
    int total = 0;
    for (int i = 0; i < k; ++i) {
        total += last_out[i][0].num;
        total += last_out[i][0].num;
        if (last_out[i][0].num != 0) {
            total++;
            total++;
        }
    }
    printf("%d ",total);
    for (int i = 0; i < k; ++i) {
        if (last_out[i][0].num != 0) {
            printf("%d %d ",real_R_list_i[i], last_out[i][0].num);
            for (int j = 0; j < last_out[i][0].num; ++j) {
                printf("%d %d ",last_out[i][j].index,last_out[i][j].I_st);
            }
        }
    }
    printf("\n");
    }
}

发表于 2020-01-18 18:26:52 回复(0)