题解 | #数据分类处理#

数据分类处理

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")

全部评论

相关推荐

04-09 09:47
门头沟学院 Java
Arbelite_:2-3k,这工资还不如去摇奶茶
点赞 评论 收藏
分享
吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务