# HJ25 数据分类处理

https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd (opens new window)

# 描述

示例:

输入:

  8 112 113 114 115 116 222 223 224
  3 22 11 33

输入说明:

  8       // 有 8 个待处理的数据
    112 
    113 
    114 
    115 
    116 
    222 
    223 
    224

  3       // 有 3 个处理规则
    22 
    11 
    33

输出:

  20 11 5 0 112 1 113 2 114 3 115 4 116 22 3 5 222 6 223 7 224

输出说明:

  对 3 个处理规则进行排序

  20          // 有 20 个处理后的数
    11 5      // 包含 11 的有 5 个,逐个列出它们的 索引和数据
      0 112   
      1 113 
      2 114 
      3 115 
      4 116 
    22 3      // 包含 22 的有 3 个,逐个列出它们的 索引和数据
      5 222 
      6 223 
      7 224
              // 包含 33 的有 0 个,则不打印

# 解答

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    let line;
    let lines = [];
    while ((line = await readline())) {
        lines.push(line);
    }

    let dataNums = lines[0]
        .split(" ")
        .slice(1)
        .map((item) => parseInt(item));
    let ruleNums = lines[1]
        .split(" ")
        .slice(1)
        .map((item) => parseInt(item));

    // 去重
    ruleNums = Array.from(new Set(ruleNums).values());

    // 排序
    ruleNums.sort((a, b) => a - b);

    const matchedRuleNumsList = new Array(ruleNums.length);

    for (let i = 0, iLen = ruleNums.length; i < iLen; i++) {
        const ruleNumStr = String(ruleNums[i]);
        const matchedRuleNums = [];

        matchedRuleNumsList[i] = matchedRuleNums;

        for (let j = 0, jLen = dataNums.length; j < jLen; j++) {
            const dataNumStr = String(dataNums[j]);

            if (dataNumStr.includes(ruleNumStr)) {
                matchedRuleNums.push([j, dataNums[j]]);
            }
        }
    }

    let results = [];

    for (let i = 0, len = ruleNums.length; i < len; i++) {
        const ruleNum = ruleNums[i];
        const matchedRuleNums = matchedRuleNumsList[i];

        if (matchedRuleNums.length === 0) {
            continue;
        }

        const ruleNumResult = [ruleNum, matchedRuleNums.length];

        matchedRuleNums.forEach(([index, num]) => {
            ruleNumResult.push(index);
            ruleNumResult.push(num);
        });

        results = results.concat(ruleNumResult);
    }

    results.unshift(results.length);

    console.log(results.join(' '));
})();
本章目录