华为机试-数据分类处理(较难)

数据分类处理

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

序列I:15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数)
序列R:5,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为0,但没有满足条件的I,不输出0,而下一个R是3
6--- 存在6个包含3的I
0--- 123所在的原序号为0
123--- 123包含3,满足条件

题目大意:
对R进行去重和排序,然后针对R中的元素,遍历I是否包含该元素,输出I中包含了的元素和对应的索引,全都不包含时不输出

#include<iostream>
#include<string>
#include<set>
#include<vector>
#include <algorithm>
#include<cstring>
using namespace std;
int main() {
    int num_I, num_R;
    while (cin >> num_I) {
        vector<string> para_I;
        set<int> para_R;//自带去重和排序,但是作为int输入,查找时记得转换成string
        string s;
        while (num_I--) { cin >> s; para_I.push_back(s); }
        cin >> num_R;
        while (num_R--) { cin >> s; para_R.insert(stoi(s)); }//字符串转数字stoi
        vector<vector<string>> ans(para_R.size());//每行存放一组结果
        int dex = 0;
        for (auto i = para_R.begin(); i != para_R.end(); i++)
        {
            int count = 0;
            for (int j = 0; j < para_I.size(); j++)
            {
                int pos = para_I[j].find(to_string(*i));//是否包含R元素
                if (pos != para_I[j].npos) {
                    ans[dex].push_back(to_string(j));
                    ans[dex].push_back(para_I[j]);
                    count++;
                }
            }
            if (count != 0) {
                ans[dex].insert(ans[dex].begin(), to_string(count));//总数加前面
                ans[dex].insert(ans[dex].begin(), to_string(*i));//对应R中的元素加前面
            }
            dex++;
        }
        int sum = 0;
        for (auto i : ans)
            sum += i.size();//输出总和
        cout << to_string(sum) << ' ';
        for (auto i : ans)
            for (auto j : i)
                cout << j << ' ';
        cout << endl;
    }


}
全部评论

相关推荐

评论
1
2
分享
牛客网
牛客企业服务