数据分类处理

来源:互联网 发布:pdf expert mac破解版 编辑:程序博客网 时间:2024/06/01 16:03

题目描述

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

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




输入描述:

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

输出描述:

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

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

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

(1)先输出R<i> 

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

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

(4)最后再输出I<j> 

附加条件: 

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

(2)如果没有满足条件的I<j>,对应的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<j>,不输出0,而下一个R<i>3

6--- 存在6个包含3I<j> 

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

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

示例1

输入

15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 1235 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中元素有相同的,则索引大的需要过滤,并且要从小到大输出,所以用STL中的set来存R。I中元素没有这些规定,用vector存即可。


然后,根据每个R<i>来判断I<j>,需要将R<i>和I<j>分别转化为字符串,然后判断R<i>是否是I<j>的子串。


最后,将所有要输出的R<i>和I<j>等信息按照题目要求存到vector中,再进行输出。需要注意的是,在记录满足条件的I<j>个数时,需要先在存了R<i>后存I<j>个数(初始化为1),再不断更新它。


代码

#include <iostream>#include <vector>#include <set>#include <string>using namespace std;string itos(unsigned int num); //将num转化为字符串int main(){    unsigned int M, N;    while (cin >> M)    {        vector<unsigned int> I;        unsigned int num;        for (unsigned int i = 0; i < M; i++) //存序列I        {            cin >> num;            I.push_back(num);        }                set<unsigned int> R;        cin >> N;        for (unsigned int i = 0; i < N; i++) //存序列R,按顺序排列,无重复元素        {            cin >> num;            R.insert(num);        }                vector<unsigned int> result;        for (auto iter = R.begin(); iter != R.end(); iter++)        {            string str = itos(*iter); //将R<i>转化为字符串            bool flag = 0; //标记是否能找到满足条件的I<j>            int index = 0; //记录满足条件的I<j>的个数的位置            for (auto iter2 = I.begin(); iter2 != I.end(); iter2++)            {                string str2 = itos(*iter2); //将I<j>转化为字符串                if (str2.find(str) != string::npos) //能在str2中找到str1                {                    if (!flag) //如果没存过R<i>,则先存R<i>和个数                    {                    result.push_back(*iter);                        result.push_back(1); //个数,后面会更新                        index = result.size() - 1; //返回个数所在位置                                                result.push_back(iter2 - I.begin()); //存索引j                        result.push_back(*iter2); //存I<j>                        flag = 1;                                            }                    else                    {                        result.push_back(iter2 - I.begin()); //存索引j                        result.push_back(*iter2); //存I<j>                        result[index]++; //更新个数                    }                }            }        }                cout << result.size() << " "; //整数个数        for (unsigned int i = 0; i < result.size(); i++)        {            if (i == result.size() - 1) //最后一个元素                cout << result[i] << endl;            else                cout << result[i] << " ";        }    }        return 0;}string itos(unsigned int num) //将num转化为字符串{    string str;    if (num == 0)    {        str = '0';        return str;    }        while (num > 0)    {        str = static_cast<char>((num % 10) + '0') + str;        num /= 10;    }        return str;}



原创粉丝点击