题解 | #数据分类处理#
数据分类处理
https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
#include<iostream>
#include<algorithm>
#include<sstream>
#include <string>
using namespace std;
int I, R;
int I_ARRY[101], R_ARRY[102]; //R多设置一个队尾
int num_changeto_string(string a) {
int digit;
stringstream ss;
ss << a;
ss >> digit;
return digit;
}
int panduan_helper(string a, string b) {
if (a.length() < b.length()) {
return 0;
}
int j = 0;
int ans = 0;
int flag = 0;
for (int i = 0; i < a.length(); i++) {
if (a[i] == b[j]) {
flag = 1;
j++;
ans++;
}
else {
if (flag ==1 ) {
i = i - ans; //这里a的指针回退,需要回退已经匹配了的长度
j = 0;
ans = 0;
}
else {
j = 0;
ans = 0;
}
flag = 0;
}
if (ans == b.length()) {
return 1;
}
}
return 0;
}
struct ansnode { //构建一个结构,用于保存
int num;
int index[100];
int I_num[100];
};
ansnode panduan(int k) {
ansnode ANS;
ANS.num = 0;
//满足条件判断
string s = to_string(k);
for (int i = 1; i <= I; i++) {
string ss = to_string(I_ARRY[i]);
if (panduan_helper(ss, s) == 1) {
ANS.index[ANS.num] = i - 1;
ANS.I_num[ANS.num] = I_ARRY[i];
ANS.num++;
}
}
return ANS;
}
int main() {
ansnode ans_fin[100];
int R_num[100];
int ans_fin_num = 0;
cin >> I;
I_ARRY[0] = I;
for (int i = 1; i <= I; i++) {
cin >> I_ARRY[i];
}
cin >> R;
R_ARRY[0] = R;
cin >> R_ARRY[1];
int RK = 0;
for (int i = 2; i <= R; i++) { //输入数据的同时用插入法排序
cin >> RK;
int loc = i;
for (int j = 1; j < i; j++) {
if (R_ARRY[j] > RK) {
loc = j;
break;
}
}
for (int j = i; j > loc; j--) {
R_ARRY[j] = R_ARRY[j - 1];
}
R_ARRY[loc] = RK;
}
R_ARRY[R + 1] = -1; //添加一个队尾数字,这个数字保证一定于前面的都不同
int total_num = 0;
for (int i = 1; i <= R; i++) {
if (R_ARRY[i] != R_ARRY[i + 1]) { //因为添加了一个队尾元素,所以每个元素都和其后一个元素比较,即可,如果没有添加队尾,按照我的比较思路就需要考虑1,2,2这种情况,只会输出1的结果
ansnode ans = panduan(R_ARRY[i]);
if (ans.num != 0) {
ans_fin[ans_fin_num] = ans;
R_num[ans_fin_num] = R_ARRY[i];
ans_fin_num++;
total_num = total_num + 2 + ans.num * 2;
}
}
}
cout << total_num << " ";
for (int i = 0; i < ans_fin_num; i++) {
cout << R_num[i] << " " << ans_fin[i].num << " ";
for (int j = 0; j < ans_fin[i].num; j++) {
cout << ans_fin[i].index[j] << " " << ans_fin[i].I_num[j] << " ";
}
}
return 0;
}
// 64 位输出请用 printf("%lld")

查看12道真题和解析