华为机试-数据分类处理(较难)
数据分类处理
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; } }