哇,这道题思路其实很简单,但是,实现起来还是要有点功夫,我写了大概1个半小时,还是菜了点。
解题的核心在于以下几点
1.使用set函数对R数组进行排序和去重
2.怎样确定R数组中的整数元素在L数组中,我采取的办法是将数组元素全部转换成string类型。使用find函数可以快速判定一个串是否是另一个串的子串。注意这里有个坑点:find函数返回的是一个数,表示的意思是这个子串在主串的第一个下标位置,因此这个返回值可以是0~k的一个整数。如果找不到,则返回的是一个无穷大的值,一定要注意判别。
3.是样例中的30怎么来。我一开始做,算了半天都是26,这是因为忽略了对于的R元素的值和L数组中包含R元素的个数。所以应该是26+2*2=30,也就是代码中的
count*2 + all.size()*2
#include <bits/stdc++.h>
using namespace std;
//记录位置和数值
struct positonandvalue {
int index;
int value;
positonandvalue(int _index, int _value) {
index = _index;
value = _value;
}
};
//判断a字符是否在b串里边
bool findainB(string b, string a) {
if(b.find(a) >= 0 && b.find(a) <= 9) {
return true;
}
else {
return false;
}
}
//数据分类处理
void dealasTypes(vector<int> L, set<int> setR) {
vector<vector<positonandvalue> > all;
vector<int> r;// 记录r的值
int count = 0;
for(auto it = setR.begin(); it != setR.end(); it++) {
int flag = 0;
vector<positonandvalue> nums;// 每一次要重新申明
for(int i = 0; i < L.size(); i++) {
if(findainB(to_string(L[i]), to_string((*it)))) {
flag = 1;
positonandvalue temp = positonandvalue(i, L[i]);
nums.push_back(temp);
count++;
}
}
if(flag == 1) {
all.push_back(nums);
r.push_back(*it);
}
}
//输出的总数目
cout << count*2 + all.size()*2 << " ";
for(int j = 0; j < all.size(); j++) {
cout << r[j] << " " << all[j].size() << " ";
for(int k = 0; k < all[j].size(); k++) {
cout << all[j][k].index << " " << all[j][k].value<< " ";
}
}
cout <<endl;
}
int main()
{
//输入R和L
int a,b;
int m,n;
cin >> a;
vector<int> L(a);
for(int i = 0; i < a; i++) {
cin >> m;
L[i] = m;
}
cin >> b;
set<int> setR;
for(int i = 0; i < b; i++) {
cin >> n;
setR.insert(n);
}
//Go
dealasTypes(L, setR);
return 0;
}